实验项目 | 线性表存储结构及实现 | 实验次序 | |||
实验地点 | 参与人员 | 个人 | 实验日期 | ||
一、实验目的 1、掌握线性表的概念及实现方式 2、熟悉线性表的存储结构及运算 | |||||
二、实验环境 VS2010 | |||||
三、实验内容 1、内容描述 定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据姓名进行查,返回此学生的学号和成绩; (4) 给定一个学生信息,插入到表中指定的位置; (5) 删除指定位置的学生记录; (6) 统计表中学生个数。 2、实现代码 #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAXSIZE 100 typedef struct{ char no[50]; char name[50]; int price; }Student; typedef struct{ Student elem[MAXSIZE]; int length; }SqList; int Locate(SqList L); int InsList(SqList &L,int i,Student e); int DelList(SqList L,int i); int main() { int i,x,a,temp,select,sum=0,c; SqList L; Student m,e; printf("********************************************************************\n"); printf("* 1. 逐个显示学生表中所有学生的相关信息; *\n"); printf("* 2. 根据姓名进行查,返回此学生的学号和成绩; *\n"); printf("* 3. 给定一个学生信息,插入到表中指定的位置; *\n"); printf("* 4. 删除指定位置的学生记录; *\n"); printf("* 5. 统计表中学生个数; *\n"); printf("* 6. 退出。 *\n"); printf("********************************************************************\n"); printf("\n"); printf("录入学生信息\n"); printf("请输入学生的数量:"); scanf("%d",&x); printf("\n"); sum=x; for(i=0;i<x;i++) { printf("第%d位学生信息\n",i+1); printf("\n"); printf("学号:"); scanf("%s",L.elem[i].no); printf("-----------------------------\n"); printf("姓名:"); scanf("%s",L.elem[i].name); printf("-----------------------------\n"); printf("成绩:"); scanf("%d",&L.elem[i].price); printf("-----------------------------\n"); } L.length=x; printf("\n"); while(true) { printf("请选择你要操作的选项:"); scanf("%d",&select); printf("\n"); switch(select) { case 1: printf("所有学生的相关信息为:\n\n"); for(i=0;i<L.length;i++) { printf("学号:%s 姓名:%s 成绩:%d\n\n",L.elem[i].no,L.elem[i].name,L.elem[i].price); } printf("\n"); break; switch的用法c语言 case 2: printf("请输入你要查的姓名:"); scanf("%s",e.name); temp=Locate(L); if(temp!=0) printf("学号:%s 成绩:%d\n\n",L.elem[temp-1].no,L.elem[temp-1].price); else printf("查失败!\n\n"); break; case 3: printf("请输入你要插入的位置:"); scanf("%d",&a); printf("请输入插入学生信息:\n"); printf("学号:"); scanf("%s",m.no); printf("姓名:"); scanf("%s",m.name); printf("成绩:"); scanf("%d",&m.price); if(InsList(L,a,m)) { sum++; printf("插入成功!\n\n"); } else printf("插入失败!\n\n"); break; case 4: printf("请输入要删除学生的位置:"); scanf("%d",&c); if(DelList(L,c)) { sum--; printf("删除成功!\n\n"); } else printf("删除失败!\n\n"); break; case 5: { printf("总学生个数为:%d\n\n",sum); } break; case 6: { printf("\n退出系统成功!请按任意键结束!\n"); exit(0); } break; } } return 0; } int Locate(SqList L) //按照姓名查 { Student e; int i; for(i=0;i<L.length+1;i++) { if(!strcmp(L.elem[i].name,e.name)) //比较两个字符串是否相同 return i+1; } return 0; } int InsList(SqList &L,int i,Student e) //插入学生信息 { /*在L中第i个位置之前插入新的数据元素e,L的长度加1*/ int k; if(i<1||(i>L.length+2)) { return 0; } for(k=L.length;k>=i-1;k--) //元素向后移动位置 L.elem[k+1]=L.elem[k]; L.elem[i-1]=e; L.length++; return 1; } int DelList(SqList L,int i) //删除指定位置学生记录 { int k; if(i<1||i>L.length+1) return 0; for(k=i;k<=L.length;k++) { L.elem[k-1]=L.elem[k]; //将后面元素依次前移 } L.length--; return 1; } | |||||
四、实验体会 1、存在问题 1. 起初未将变量名启用数组的形式,通过调试发现姓名无法储存,学号只能储存一位数字,深刻体会存储字节的问题。 2. 关于结构体的嵌套,如何引用其中变量问题有了深刻体会。 3. 观察到老师给的代码中sqlist &L,而我均未使用&引用符号,依然可以运行。于是查资料编写 此时的Head(地址)的值与L相同! 若将引用符号&删去,则L不将改变Head的值,故&有种将传进去的参数“带出来”的作用。 于是发现即便插入了数据,再次输出时未显示插入的数据,于是进行改进加上& 果然插入的信息可以输出。 2、心得体会 1.复习了switch case 以及strcmp比较函数的用法; 2.学会增删操作中元素前后移的实现; 3.这次实验让我真正的明白了sqList &L的使用:在函数调用中引用变量一定要初始化才可以使用。要返回到main里面进行操作、改变的顺序表需要带上&,如果只在对应函数操作的顺序表则不用。 | |||||
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论