1、数学与计算机学院实 验 报 告( 2011 / 2012 学年 第 1 学期)课程名称 数据结构课程代码 6014279实验时间 年 月 日指导单位 软件工程系指导教师 周立章学生姓名 吴超 年 级 10 级学 号 312010080611402 专 业 软件工程实验成绩数据结构实验报告实验名称 学生成绩管理系统 指导教师 周立章实验类型 设计 实验学时 2+10 实验时间一、 实验目的和要求(1)掌握线性表的顺序存储结构,在顺序存储结构基础上进行的插入、删除、查找等算法的思想和实现;(2)掌握线性表的链式存储结构。掌握线性表的链式存储结构的建立。在链表中插入、删除和查找算法的思想和算法实现。
2、(3)掌握线性表在顺序存储、链式存储结构的基础进行的各种应用。(4)掌握链表的定义和基础知识以及链表的存储和链式存储结构及其应用。(5)掌握队列的基础知识,循环顺序队列、链队列及其应用。(6)会用结构体正确描述每一条学生记录的信息,掌握链表结构存储所处理的数据。(7)设计友好的人机交互菜单,通过相应的流程控制语句的正确使用,使得在主函数中体现对各功能模块的调用,从而实现一个完整的小型管理系统。要求:课内实验学时 2 学时,课后学时要求为 10 学时。二、实验环境(实验设备)硬件: 微型计算机 P4软件: Windows XP+Microsoft Visual C+6.0三、实验原理及内容实验题
3、目 利用链式存储结构存储学生的成绩信息,设计一个学生成绩管理系统,具有以下功能:(1)定义学生结构体类型 struct Student,每个学生包括学号、姓名、3 门功课(课程名自己定义) 、总分。(2)建立双向循环链表:输入若干学生的信息(当输入学生的学号为 0000 时结束,要求自动计算总分) ,并按输入的顺序建立双向循环链表;(3)输出学生成绩信息:遍历双向循环链表,输出所有学生的完整信息到屏幕;(4)查找指定学号的学生信息。如果查找成功,输出所有学生信息,否则输出失败。(5)插入学生信息:以队列的方式将新学生成绩信息插入到链表中;数据结构实验报告2(6)删除学生信息:给出学生姓名,删除
4、链表所有相同姓名的学生的信息(即姓名相同的结点) ;(7)修改学生信息:给出学生学号,修改该生的三门课程成绩信息;(8)按总分排序:在原来的双向循环链基础上按总分降序进行就地排列。即不能增加额外的空间开销;实验前准备:完成上述(1)-(4)算法,并要求上机验证通过。实验时完成(5)-(6)。实验后,完成算法(7) ,(8) ,并要求上机验证通过。实验解答:1) 画出主函数的流程图主函数 m a i n ()菜单函数 M e n u输入函数 输出函数 查询函数 插入函数 删除函数 排序函数 修改函数2)数据类型定义(1)学生成绩信息结构体类型的定义struct Student int num;c
5、har name20;int math;数据结构实验报告3int chinese;int english;int sum;struct Student *prior,*next; ;(2)双向链表结点的定义。是否将结点的数据类型定义为学生成绩信息结构体类型?是的;3)为了能够完成链表的各项操作,你给出的测试数据有哪些?主要用于测试哪些方面?1 菜单函数测试:2 输入函数测试3 查询函数测试数据结构实验报告44 插入函数测试5 删除函数测试6 输出函数测试7 修改函数测试8 排序函数测试数据结构实验报告5实 验 报 告4)你是否在实验前完成了算法(1)-(4)?如果完成了难点在哪儿?。如果没有完
6、成,理由是什么?答:是;难点在于双向循环链表的创建,在最后需要把最后一个结点指向头结点,否则会出现一系列问题;5)建立双向循环链表,你采用的是后插法还是前插法?写出 C+语言代码。答:前插法,代码如下:void RDLink:Create()Student *p,*s; int x;if(head=new Student)=NULL)coutprior=NULL;head-next=NULL;p=head;coutnext=s;coutx;if(x=0000)break;elses-num=x;couts-name;couts-math;couts-chinese;couts-english;
7、s-sum=s-math+s-chinese+s-english;s-prior=p;s-next=NULL;p=s;数据结构实验报告7s-next=head;head-prior=s;coutnext;用 while(p!=head)来控制循环;循环一次 p再指向下一结点:p=p-next;void RDLink:DispList()Student *p=head-next;while (p!=head) coutnumnamemathchineseenglishsumnext;coutnext;数据结构实验报告98)插入算法:当按队列的方式进行插入运算时,新学生信息是插入到什么位置?写出算
8、法。答:插到末尾void RDLink:InsElem()Student *s;s=new Student;Student *p=head;couts-num;couts-name;couts-math;couts-chinese;couts-english;s-sum=s-math+s-chinese+s-english;head-prior-next=s;s-prior=head-prior;数据结构实验报告10head-prior=s;s-next=head;coutnext,*s;s=new Student; s-data=x;if(i=1)head-prior=s;head-next
9、=s;s-prior=head;s-next=head;elsewhile (jnext;j+;数据结构实验报告11s-next=p-next; s-prior=p; if (p-next!=head) p-next-prior=s;p-next=s; return 1; 时间复杂度为:0(n)10)删除操作:在该删除中,时间开销主要用在什么地方?写出删除算法的代码,给出时间复杂度。它与顺序表中同样的删除上有什么不同?你是如何保证删除了所有姓名相同的结点的?答:用在遍历链表上;时间复杂度为:O(n)顺序表没有链表中前后指针,不用让前后指针指来指去;遍历整个双线循环链表,只要姓名相同,则执行删除
10、操作;int RDLink:DelElem()Student *p=head-next,*q;coutm;int j=1,x=0;while (p!=head) 数据结构实验报告12if(strcmp(p-next-name,m)=0) q=p-next; p-next=q-next;if (q-next!=head)q-next-prior=p;delete q; coutnext; j+; if(x=0)coutx;Student *p=head-next;while (p!=head) if(p-num=x)coutd;p-num=d;couta;p-chinese=a;coutb;p-
11、english=b;coutc;p-math=c;p-sum=a+b+c;coutnext;12)按总分排序时,你是否增加了空间?写出该算法的代码。答:没有增加。void RDLink:Rank()Student *p=head-next;Student *q=head-next-next;while(p!=head)while(q!=head)if(p-sumsum)p-prior-next=q;q-next-prior=p;q-prior=p-prior;p-next=q-next;数据结构实验报告15q-next=p;p-prior=q;q=q-next;p=p-next;cout“排序
12、成功!“endl;数据结构实验报告16实 验 报 告四、实验小结(包括问题和解决方法、心得体会、意见与建议等)1在使用链表存储学生信息进行编程时,你所遇到的主要问题是什么,如何解决的?由于本人对链表的操作并不是特别熟练,特别是像这种双向循环链表,刚开始做的时候真的是完全靠照搬老师代码,但是在拼凑的过程中一次次的出错,比如一进行插入操作和删除操作就意外停止,通过自己不断的调试,并查找资料,自己画图理解,修改代码,终于把问题搞定了!2链栈的进栈操作需什么条件?栈操作的特点是什么? 答:需要栈未满;特点是只能从顶部进栈,比较简单。3队列操作的特点是什么?如果 Q 表示是循环顺序队列,则表示 Q 为空
13、的条件和满的条件是什么?答:特点:队头出队,队尾入队。队满的条件:(rear+1)%MaxSize=front (此时,循环队列中能装入的元素的个数为 MaxSize)队空的条件:rear=front4在删除算法中,你准备的测试数据是什么?是否都按算法姓名相同的都删除?答: 准备了两个姓名相同的数据,不存在的一个姓名,存在的姓名。经过测试,姓名相同的结点均被删除。5.对学生的成绩信息进行相关操作,你认为使用链式存储结构合理吗?说明理由。答:合理,虽然使用链式存储太过复杂,需要指针不断的变化来达到目的,非常容易出错,但是它不需要不断的移动元素,并且指针的变化不需要位置的连续,还可以节省空间。 五、指导教师评语数据结构实验报告17成 绩 批阅人 日 期