课程名称 数据结构实验 第(三)次实验 实验名称 顺序表的应用
学生姓名 于歌 专业班级 学号
实验成绩 指导老师(签名 ) 日期 2018年9月30日
一、实验目的
1.学会定义线性表的顺序存储类型,实现C程序的基本结构,对线性表的一些基本操作和具体的函数定义。
2.掌握顺序表的基本操作,实现顺序表的插入、删除、查找以及求并集等运算。
3.掌握对多函数程序的输入、编辑、调试和运行过程。
二、实验要求
1.预习C语言中结构体的定义与基本操作方法。
2.对顺序表的每个基本操作用单独的函数实现。
3.编写完整程序完成下面的实验内容并上机运行。
4.整理并上交实验报告。
三、实验内容:
1.定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能:
(1)根据指定学生个数,逐个输入学生信息
(2)逐个显示学生表中所有学生的相关信息
(3)根据姓名进行查找,返回此学生的学号和成绩
(4)根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
(5)给定一个学生信息,插入到表中指定的位置
(6)删除指定位置的学生记录
(7)统计表中学生个数
四、实验设计
1.定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能:
(1)根据指定学生个数,逐个输入学生信息
for(count=0; count scanf("%s%s%d",e.no,e.name,&e.score); Input(&L,e); } Status Input(SqList *L,ElemType e) { if(!(*L).elem) return ERROR; (*L).elem[(*L).length++]=e; return OK; } (2)逐个显示学生表中所有学生的相关信息 Status Print(SqList L) { printf(" 学号 姓名 成绩 \\n"); int count; for(count=0; count return OK; } void Pri(ElemType e) { printf("%8s |",e.no); printf("%20s |",e.name); printf("%8d \\n",e.score); } (3)根据姓名进行查找,返回此学生的学号和成绩 Status LocateElem(SqList L,ElemType e) { int count; for(count=0; count break; if(count printf(" 学号 姓名 成绩 \\n"); Pri(L.elem[count]); } else printf("%s在顺序表中查不到!\\n",e.name); return OK; } (4)根据指定的位置可返回相应的学生信息(学号,姓名,成绩) Status LocateNum(SqList L,int i) { if(i<1||i>L.length+1) return OVERFLOW; printf(" 学号 姓名 成绩 \\n"); Pri(L.elem[i-1]); return OK; } (5)给定一个学生信息,插入到表中指定的位置 Status ListInsert(SqList *L,int i,ElemType e) { int count; if(i<1||i>(*L).length+1) return OVERFLOW; if((*L).length==(*L).MaxSize) (*L).elem=(ElemType *)realloc((*L).elem,sizeof(ElemType)*((*L).MaxSize+LISTINCREMENT)); if(!(*L).elem) exit(OVERFLOW); for(count=(*L).length-1; count>=i-1; count--) (*L).elem[count+1]=(*L).elem[count]; (*L).elem[i-1]=e; (*L).length++; return OK; } (6)删除指定位置的学生记录 Status ListDelete(SqList *L,int i) { int count; if(i<1||i>(*L).length+1) return OVERFLOW; for(count=i; count<(*L).length; count++) (*L).elem[count-1]=(*L).elem[count]; (*L).length--; return OK; } (7)统计表中学生个数 printf("表中学生的个数为:%d\\n",L.length); (8)主函数 int main() { SqList L; ElemType e; int i,count,n,number; InitList(&L); printf("请输入学生的个数:\\n"); scanf("%d",&n); printf("请输入学号、姓名、成绩:\\n"); for(count=0; count scanf("%s%s%d",e.no,e.name,&e.score); Input(&L,e); } printf("学生信息生成成功!\\n"); Pr(); scanf("%d",&n); while(n>0&&n<7) { switch(n) { case 1: Print(L); break; case 2: printf("请输入要查找的学生的姓名:"); scanf("%s",e.name); LocateElem(L,e); break; case 3: printf("请输入要查找的学生的位置:"); scanf("%d",&i); LocateNum(L,i); break; case 4: printf("输入插入学生的位置、学号、姓名、成绩:"); scanf("%d%s%s%d",&i,e.no,e.name,&e.score); if(ListInsert(&L,i,e)) printf("插入成功!\\n"); break; case 5: printf("请输入要删除的学生的位置:\\n"); scanf("%d",&i); if(ListDelete(&L,i)) printf("删除成功!\\n"); break; case 6: printf("表中学生的个数为:%d\\n",L.length); } Pr(); scanf("%d",&n); } if(n==7) printf("退出成功!"); return 0; } 五、实验测试 2.定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能运行界面 六、总结 附录1:源代码 #include #include #include #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OK 1 #define ERROR 0 #define OVERFLOW 2 typedef int Status; typedef struct { char no[8]; char name[20]; int score; }Student; typedef Student ElemType; typedef struct { ElemType *elem; int length; int MaxSize; } SqList; Status InitList(SqList *L) { (*L).elem=(ElemType *)malloc(sizeof(ElemType)*LIST_INIT_SIZE); if(!(*L).elem) exit(OVERFLOW); (*L).length=0; (*L).MaxSize=LIST_INIT_SIZE; return OK; } Status Input(SqList *L,ElemType e) { if(!(*L).elem) return ERROR; (*L).elem[(*L).length++]=e; return OK; } Status ListInsert(SqList *L,int i,ElemType e) { int count; if(i<1||i>(*L).length+1) return OVERFLOW; if((*L).length==(*L).MaxSize) (*L).elem=(ElemType *)realloc((*L).elem,sizeof(ElemType)*((*L).MaxSize+LISTINCREMENT)); if(!(*L).elem) exit(OVERFLOW); for(count=(*L).length-1; count>=i-1; count--) (*L).elem[count+1]=(*L).elem[count]; (*L).elem[i-1]=e; (*L).length++; return OK; } Status ListDelete(SqList *L,int i) { int count; if(i<1||i>(*L).length+1) return OVERFLOW; for(count=i; count<(*L).length; count++) (*L).elem[count-1]=(*L).elem[count]; (*L).length--; return OK; } Status LocateElem(SqList L,ElemType e) { int count; for(count=0; count break; if(count printf(" 学号 姓名 成绩 \\n"); Pri(L.elem[count]); } else printf("%s在顺序表中查不到!\\n",e.name); return OK; } Status LocateNum(SqList L,int i) { if(i<1||i>L.length+1) return OVERFLOW; printf(" 学号 姓名 成绩 \\n"); Pri(L.elem[i-1]); return OK; } Status Print(SqList L) { printf(" 学号 姓名 成绩 \\n"); int count; for(count=0; count return OK; } void Pri(ElemType e) { printf("%8s |",e.no); printf("%20s |",e.name); printf("%8d \\n",e.score); } void Pr() { printf("\\n1.输出全部的学生信息\\n"); printf("2.通过姓名查找学号和成绩\\n"); printf("3.通过位置查找学生的信息\\n"); printf("4.插入学生信息\\n"); printf("5.删除学生信息\\n"); printf("6.统计学生个数\\n"); printf("7.退出\\n"); printf("请输入要使用的功能:"); } int main() { SqList L; ElemType e; int i,count,n,number; InitList(&L); printf("请输入学生的个数:\\n"); scanf("%d",&n); printf("请输入学号、姓名、成绩:\\n"); for(count=0; count scanf("%s%s%d",e.no,e.name,&e.score); Input(&L,e); } printf("学生信息生成成功!\\n"); Pr(); scanf("%d",&n); while(n>0&&n<7) { switch(n) { case 1: Print(L); break; case 2: printf("请输入要查找的学生的姓名:"); scanf("%s",e.name); LocateElem(L,e); break; case 3: printf("请输入要查找的学生的位置:"); scanf("%d",&i); LocateNum(L,i); break; case 4: printf("输入插入学生的位置、学号、姓名、成绩:"); scanf("%d%s%s%d",&i,e.no,e.name,&e.score); if(ListInsert(&L,i,e)) printf("插入成功!\\n"); break; case 5: printf("请输入要删除的学生的位置:\\n"); scanf("%d",&i); if(ListDelete(&L,i)) printf("删除成功!\\n"); break; case 6: printf("表中学生的个数为:%d\\n",L.length); } Pr(); scanf("%d",&n); } if(n==7) printf("退出成功!"); return 0; }下载本文