HUBEI UNIVERSITY OF AUTOMOTIVE TECHNOLOGY
数据结构 实 验 报 告
实验项目 学生姓名 完成日期 指导教师 实验成绩 评阅教师
实验一 宋大超 实验类别 学生学号 2016-10-9 袁科 基础篇 201501149 评阅日期 实验一 线性表基本操作的编程实现
. 专业资料分享 .
完美WORD格式.整理
【实验目的】
线性表基本操作的编程实现 要求:
线性表基本操作的编程实现(2学时,验证型),掌握线性表的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找、逆序、排序等操作,存储结构可以在顺序结构或链表结构中任选,可以完成部分主要功能,也可以用菜单进行管理完成大部分功能。还鼓励学生利用基本操作进行一些更实际的应用型程序设计。
【实验性质】
验证性实验(学时数:2H)
【实验内容】
把线性表的顺序存储和链表存储的数据插入、删除运算其中某项进行程序实现。建议实现键盘输入数据以实现程序的通用性。为了体现功能的正常性,至少要编制遍历数据的函数。
【注意事项】
1.开发语言:使用C。
2.可以自己增加其他功能。
【实验分析,说明过程】 本次实验主要是检验单链表数据的插入与删除。实验的第一部分是要求将学生e的信息插入到第i个学生的前面,也就是在两个节点之间建立新的节点。我们此次实验有两个要求。第一个是将一个新的学生信息插入到原来的学生信息当中去。第二个要求是要删除一个学生的信息。以下我将通过示意图和文字的方式说明这次实验的完成方法。需要说明的是此处的i表示学生信息的一个序号元素。 在第i个学生信息插入时,就得把第i个学生之后的所有节点依次向后移动一个位置。在将新的节点X插入到第i的位置。 1 2 3 4 n 1 2 3 4 5 n Stu[1] Stu[2] Stu[3] Stu[4] e Stu[n] Stu[1] Stu[2] Stu[3] Stu[4] Stu[n] 如上图所示,例如将学生e的信息插入到第五个位置。我们先将指针指向最后一个位置,由于要插入一个新的节点,原来数组的长度发生了变化。数据的存储空间位置也随之发生了变化,为此,我们将最后一个 . 专业资料分享 .
完美WORD格式.整理
节点向后移动,利用for循环将第五个节点之后的依次向后移动,直到所有的元素都向后移动了一位。 对于顺序链表的删除工作实际上与其插入工作相反,只需要将表中第i+1个到第n个节点的所有元素依次向后移动一个位置。 1 2 3 4 5 1 2 3 4 Stu[1] Stu[2] Stu[4] Stu[5] Stu[1] Stu[2] Stu[3] Stu[4] Stu[5] 如上图所举例的那样,当我们删除第三个元素是,第三个元素后面的元素依次向前移动了一位。我们可以直接找到第i个元素后面的位置将其向前移动一个。 【思考题】 . 专业资料分享 .
完美WORD格式.整理
一:线性表的顺序存储和链表存储的差异?优缺点分析? 答:1、差异: 线性表的顺序存储的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需预先分配,它是静态分配内存。顺序表的存储空间是静态分配的,在程序执行之前必须明确规定它的存储规模,也就是说事先对“MaxSize”要有合适的设定,设定过大会造成存储空间的费,过小造成溢出。因此,当对线性表的长度或存储规模难以估计时,不宜采用顺序表。 线性表的链表存储是在逻辑上相邻的数据元素,物理存储位置不一定相邻,它使用指针实现元素之间的逻辑关系。并且,链表的存储空间是动态分配的。链表的动态分配则可以克服需要预先设定空间大小的缺点。链表不需要预留存储空间,也不需要知道表长如何变化,只要内存空间尚有空闲,就可以再程序运行时随时地动态分配空间,不需要时还可以动态回收。因此,当线性表的长度变化较大或者难以估计其存储规模时,宜采用动态链表作为存储结构。 2、优缺点: 线性表的顺序存储优点: 1方法简单,如数组,容易实现。 ○2不用为表示节点间的逻辑关系而增加额外的存储开销。 ○3顺序表具有按元素序号随机访问的特点。 ○ 线性表的顺序存储缺点: 1在顺序表中做插入、删除操作时,移动表中的大量元素,因此对n较大的顺序表效率低。 ○ 2需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置;预先分 ○配过小,又会造成溢出。 线性表的链式存储优点: 1插入、删除运算方便,只需调整指针的指向即可。 ○2能够动态分配内存,不需要预选分配好空间,能更加有效率的利用空间资源。 ○ 线性表的顺序存储缺点: 1每次访问链表时只能从头节点开始,不能做到随机访问。 ○2要占用额外的存储空间存储元素之间的关系,存储密度降低。 ○二、哪些操作引发了数据的移动? 答:数据的插入、删除、排序、归并等。 三、算法的时间效率是如何体现的? 答:通过时间频度和时间复杂度来体现的。 四、链表的指针是如何后移的?如何加强程序的健壮性? 答:(1)假如指针p指向某个结点,那么p=p->next;就可以使指针后移,就是把p所指向结点的指针域的值重新给指针p。 (2)增加程序的容错控制;算法尽量避免一些隐患错误;降低时间复杂度;尽量少执行一些复杂的操作;提高算法的效率等。 【实验小结】 一、 重难点 . 专业资料分享 .
完美WORD格式.整理
对于我来说由于基础不够扎实,所以最难理解应该是此次实验里面关于length的理解,我觉得此次实验的关于数据的插入与删除算法上的理解很容易,也简单。主要是关于其中的length有很多不明白的地方。最开始定义的时候int型。而这里的length既可以作为一种指针,也可以作为一种长度,及相当于数组的下标。只要理解了length,整个实验就好做了。 二、 心得与体会 由于基本功不扎实,导致在做实验的时候遇到很多的困难,好在在之后的询问中,也大概理解了之前的问题。通过这次实验,使我对C语言相关知识理解更加透彻明了,特别是对指针、结构体的理解使我见识到指针的强大与灵活性。以前在C语言上的欠债我觉得我会补起来的。 三、 收获 我觉得此次最大的收获就是关于结构体指针的理解。结构体指针的应用太广泛了,几乎贯穿整个数据结构的全本书,所以,对于指针的理解和应用非常重要。为此我将不懈努力学好C语言这门课。 【实验代码】 #include 完美WORD格式.整理 scanf(\"%f\ //输入第i个学生的成绩 Li->length++; //学生人数加1 } } int listinsert(LIST *Li,int i) //将学生插入到班级Li的第i个位置。 //插入一个学生信息 { int j; STUDENT e; if(Li->length>=MAXSIZE-1) //测试存储空间是否被占满 { printf(\"无更多的存储空间!\\n\"); return 0; } if (i<=0||i>=Li->length+2) //插入位置检验,如果错误就返回0退出程序。 { printf(\"插入位置有误!\\n\"); return 0; } else { printf(\"请输入插入的学生信息:\\n\"); printf(\"学号:\"); scanf(\"%d\ printf(\"姓名:\"); scanf(\"%s\ printf(\"成绩:\"); scanf(\"%f\ for(j=Li->length; j>=i ;j--) Li->stu[j+1]=Li->stu[j] ; //利用for循环将第i个及其后面的元素依次往后移动 Li->stu[i] =e ; //移开位置后将学生e放入到i位置 Li->length++ ; //完成插入后,学生实际人数加1 return 1; } } . 专业资料分享 . 完美WORD格式.整理 int listdel(LIST *Li,int i) //删除一个学生信息 //删除第i个学生的信息 { if (i<=0||i>Li->length) //删除位置检验,如果错误就返回0退出程序。 return 0; else { for(;i 完美WORD格式.整理 printf(\" 请输入你的选择:\"); scanf(\"%d\ switch(no) { case 1: printf(\"班级信息初始化,按任意键继续……\\n\"); getch(); printf(\"请输入班级学生原始人数:\"); scanf(\"%d\ listcreate(&stu_info,stu_count); system(\"cls\"); showmenu(); listdisplay(stu_info); printf(\"班级信息初始化已经完成,按任意键继续……\\n\"); getch(); system(\"cls\"); break; case 2:printf(\"插入前班级信息:\\n\"); listdisplay(stu_info); printf(\"请输入插入位置:\"); scanf(\"%d\ listinsert(&stu_info,pos); printf(\"插入后班级信息:\\n\"); listdisplay(stu_info); printf(\"插入已经完成,按任意键继续……\\n\"); getch(); system(\"cls\"); break; case 3:printf(\"删除前班级信息:\\n\"); listdisplay(stu_info); printf(\"请输入删除位置:\"); scanf(\"%d\ listdel(&stu_info,pos); printf(\"删除后班级信息:\\n\"); listdisplay(stu_info); printf(\"删除已经完成,按任意键继续……\\n\"); getch(); system(\"cls\"); break; case 4:listdisplay(stu_info); printf(\"显示结果如上所示,按任意键继续……\\n\"); getch(); system(\"cls\"); break; case 5:return; . 专业资料分享 . 完美WORD格式.整理 } } } . 专业资料分享 . 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务