您的位置:首页 > 理论基础 > 数据结构算法

C语言数据结构实现顺序表增删改差(数据结构第一次实验)

2017-10-24 22:22 806 查看
本次博客记录C语言第一次数据结构作业,部分参考了

1.严蔚敏版C数据结构

2.http://blog.csdn.net/wang907553141/article/details/52607380

但是大部分逻辑时自己实现,由于基础不好,所以逻辑比较混乱

Lab1 线性表的基本操作及其应用

课程名:数据结构

实验目的:

1、掌握线性表的定义;
2、掌握线性表的基本操作,如建立、查找、插入和删除等。

实验要求:定义一个包含学生信息(学号,姓名,成绩)的顺序表和链表,使其具有如下功能:

(1) 根据指定学生个数,逐个输入学生信息;

(2) 逐个显示学生表中所有学生的相关信息;

(3) 根据姓名进行查找,返回此学生的学号和成绩;

(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);

(5) 给定一个学生信息,插入到表中指定的位置;

(6) 删除指定位置的学生记录;

(7) 统计表中学生个数。

实验题目:线性表的基本操作及其作用

实验过程:

按照实验要求编写相应程序代码,并调试运行。

附:顺序表与链表操作的主函数代码。

运行演示过程如下(这部分不需要写到报告上):

1、 创建一个学生表(5个学生);

2、 显示该表中所有的元素;

3、 根据姓名查找到第3个学生的信息并显示;

4、 插入一个新的学生并显示全部学生信息;

5、 删除第3个学生的信息并显示全部学生信息;

6、 统计学生表中元素的个数(即学生人数);

7、 退出

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef struct
{
int id;
char name[20];
int score;
}Student;
typedef Student ElemType;
typedef struct
{
ElemType *elem;
int length;
}SqList;
//创建顺序表操作//
Status Creat(SqList &L)
{
L.elem=new ElemType[MAXSIZE];
if(!L.elem) return ERROR;
L.length=0;
return OK;
}
//给顺序表添加基本学生信息操作//
Status Insert(ElemType *e)
{
printf("请输入学生的学号:");
scanf("%d",&e->id);
printf("请输入学生的姓名:");
scanf("%s",&e->name);
printf("请输入学生的成绩:");
scanf("%d",&e->score);
}
//显示所有学生信息操作//
Status Output(ElemType *p)
{
printf("%d\t",p->id);
printf("%s\t",p->name);
printf("%d\n",p->score);
}
//根据学号查询操作//
Status Search(ElemType *p,char f[20])
{
if(strcmp(p->name,f)==0)
{
printf("该生的学号是:%d\n",p->id);
printf("该生的学号是:%s\n",p->name);
printf("该生的学号是:%d\n",p->score);
return OK;
}
}
//插入操作//
Status Add(ElemType *p0,ElemType *p1,SqList &L,int i)
{
if(p1->id<p0->id)
{
//插入的学生不在末尾时 //
for(int s=L.length;s>=i+1;s--)
{
L.elem[s]=L.elem[s-1];
}
L.elem[i]=*p1;
L.length+=1;
return OK;
}
else
{
//插入的学生在末尾时//
if(i==L.length-1)
{	printf("ssssssssssssssssssssssssssss\n");
L.elem[i+1]=*p1;
L.length+=1;
return OK;
}
}
return ERROR;
}
//删除操作//
Status Delete(SqList &L,int d,ElemType *p,int i)
{
if(p->id==d)
{
if(i!=L.length-1)
{
//删除的学生不再末尾时//
for(i;i<=L.length-2;i++)
{
L.elem[i]=L.elem[i+1];
}
L.length=L.length-1;
return OK;
}
else
{
//删除的学生在末尾时//
L.length=L.length-1;
return OK;
}
}
}
int main()
{
SqList L;
int choose,r,p;
printf("====================================\n");
printf("欢迎使用学生成绩管理系统V1.00\n");
printf("功能如下:\n");
printf("输入1:创建空的顺序表\n");
printf("输入2:添加学生的信息\n");
printf("输入3:显示顺序表所有学生的信息\n");
printf("输入4:根据姓名查找学生的信息\n");
printf("输入5:插入一个新的学生\n");
printf("输入6:删除一个学生的信息\n");
printf("输入7:统计表中的学生个数\n");
printf("输入0:退出系统\n");
printf("====================================\n");
while(1)
{
printf("请选择命令:");
scanf("%d",&choose);
if(choose==0)
{
printf("非常感谢您使用本系统!");
break;
}
switch(choose)
{
case 1:
r=Creat(L);
if(r==1)
{
printf("创建顺序表成功!\n")	;
}
else
{
printf("创建顺序表失败!\n");
}
break;
case 2:
int num;
printf("请输入创建的学生数:");
scanf("%d",&num);
for(int i=0;i<=num-1;i++)
{
Insert(&L.elem[i]);
L.length+=1;
}
break;
case 3:
printf("id\t");
printf("name\t");
printf("score\n");
for(int i=0;i<=L.length-1;i++)
{
Output(&L.elem[i]);
}
break;
case 4:
int result_Search;
char f4[20];
printf("请输入要查找的学生的姓名:");
scanf("%s",&f4);
for(int i=0;i<=L.length-1;i++)
{
result_Search=Search(&L.elem[i],f4);
}
if(result_Search==1)
{
printf("查询成功!\n");
}
break;
case 5:
ElemType newstu;
Insert(&newstu);
int add;
for(int i=0;i<=L.length-1;i++)
{

add=Add(&L.elem[i],&newstu,L,i);
if(add!=1)
{
continue;
}
else
{
printf("插入成功!\n");
break;
}
}
break;
case 6:
int delstu;
int del_result;
printf("请输入要删除的学生的学号:");
scanf("%d",&delstu);
for(int i=0;i<=L.length-1;i++)
{
del_result=Delete(L,delstu,&L.elem[i],i);
if(del_result==1)
{
printf("删除成功!\n");
break;
}
}
break;
case 7:
printf("当前表中共有%d个学生!\n",L.length);
break;

}
}
return 0;
}
本次实验中出现了一个折磨了我2个小时的Bug:
定一个整型变量add,如果add等于一个整型函数的返回值,且该函数没有return,每调用一次add的值就会从0开始加1,调用5次就加到5。
最开始的时候没有注意,调试了很长时间,所以整型函数一定要有返回值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息