北邮数据结构实验报告实验一线性表_第1页
北邮数据结构实验报告实验一线性表_第2页
北邮数据结构实验报告实验一线性表_第3页
北邮数据结构实验报告实验一线性表_第4页
北邮数据结构实验报告实验一线性表_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验名称:实验一线性表题目1学生姓名:申宇飞班级:信通3班班内序号:03学号:64日期:2013年11月4日1. 实验要求实验目的:熟练掌握线性表的基本操作,包括:创建、插入、删除、查找、输出、求长度、合并等运算,以及各类操作在顺序存储结构和链式存储结构上的实现。实验内容:根据线性表的抽象数据类型的定义,选择下面任一种链式结构实现线性表,并完成线性表的基本功能。线性表存储结构(五选一):1、带头结点的单链表2、不带头结点的单链表3、循环链表4、双链表5、静态链表线性表的基本功能:1、构造:使用头插法、尾插法两种方法2、插入:要求建立的链表按照关键字从小到大有序3、删除4、查找5、获取链表长度6

2、、销毁7、其他:可自行定义编写测试main()函数测试线性表的正确性。2. 程序分析存储结构链表的具体存储表示为: 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的) 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址信息(称为指针)链表的结点结构?I1?datanext?1?data域-存放结点值的数据域?next域-存放结点的直接后继的地址(位置)的指针域(链域)地址1080H10C0H内存单元头指针一W20Hfront1000H关键算法分析1、关键算法:1 :头插法自然语言描

3、述:a:在堆中建立新结点b:将ai写入到新结点的数据域c:修改新结点的指针域d:修改头结点的指针域。将新结点加入链表中伪代码描述a:Node<T>*s=newNode<T>b:s->data=aic:s->next=front->next;d:front->next=s2:尾插法自然语言描述:a:在堆中建立新结点:b:将ai写入到新结点的数据域:c:将新结点加入到链表中d:修改修改尾指针伪代码描述a:Node<T>*s=newNode<T>b:s->data=aic:r->next=s;d:r=s3:析构/删除

4、函数自然语言描述:a: 新建立一个指针,指向头结点b: 判断要释放的结点是否存在,c: 暂时保存要释放的结点d: 移动a中建立的指针e: 释放要释放的指针伪代码描述a:Node<T>*p=frontb:while(p)c:front=pd:p=p->nexte:deletefront4:按位查找函数自然语言描述:a: 初始化工作指针p和计数器j,p指向第一个结点,j=1b: 循环以下操作,直到p为空或者j等于1b1:p指向下一个结点b2:j加1c: 若p为空,说明第i个元素不存在,抛出异常d: 否则,说明p指向的元素就是所查找的元素,返回元素地址伪代码描述a:Node<

5、T>*p=front->next;j=1;b:while(p&&j!=1)b1:p=p->nextb2:j+c:if(!p)throw”error”d:returnp5:按位查找函数自然语言描述:a: 初始化工作指针p和计数器j,p指向第一个结点,j=1b: 循环以下操作,找到这个元素或者p指向最后一个结点b1:判断p指向的结点是不是要查找的值,如果是,返回j,否则p指向下一个结点,并且j的值加一c: 如果找到最后一个结点还没有找到要查找的元素,返回查找失败信息伪代码描述a:Node<T>*p=front->next;j=1;b:while(

6、p)b1:if(p->next=x)returnjp=p->nextj+c:return“error”6:插入函数自然语言描述:a: 在堆中建立新结点b: 将要插入的结点的数据写入到新结点的数据域c: 修改新结点的指针域d: 修改前一个指针的指针域,使其指向新插入的结点的位置伪代码描述a:Node<T>*s=newNode<T>b:s-data=p->datac:s->next=p->nextd:p->next=se:p->data=x7:删除函数自然语言描述:a: 从第一个结点开始,查找要删除的位数i前一个位置i-1的结点b:

7、 设q指向第i个元素c: 将q元素从链表中删除d: 保存q元素的数据e: 释放q元素伪代码描述a:q=p->nextb:p->next=q->nextc:x=q->datad:deleteq8:遍历打印函数自然语言描述:a: 判断该链表是否为空链表,如果是,报错b: 如果不是空链表,新建立一个temp指针c: 将temp指针指向头结点d: 打印temp指针的data域e: 逐个往后移动temp指针,直到temp指针的指向的指针的next域为空伪代码描述Iffront->next=NULLThrow”anemptylist”Node<T>*temp=fr

8、ont->next;while(temp->next)cout<<temp->data<<""temp=temp->next;9:获取链表长度函数自然语言描述:a: 判断该链表是否为空链表,如果是,输出长度0b: 如果不是空链表,新建立一个temp指针,初始化整形数n为0c:将temp指针指向头结点d:判断temp指针指向的结点的next域是否为空,如果不是,n加一,否则returnne:使temp指针逐个后移,重复d操作,直到temp指针指向的结点的next域为0,返回n伪代码描述intn=0ifront->next=

9、NULLn=0;elseNode<T>*temp=front->next;while(temp->next)n+;temp=temp->next;returnn;2、代码详细分析:(1)从第一个结点开始,查找节点,使它的数据比x大,设p指向该结点:while(x>p->data)p=p->next;(2)新建一个节点s,把p的数据赋给s:s->data=p->data;(3)把s力口至Up后面:s->next=p->next;p->next=s;(4)p节点的数据用x替换:p->data=x;示意图如图所示s3

10、、关键算法的时间复杂度:O(1)3.程序运行结果程序截图1 .流程图:2 .测试条件:插入、删除元素的位置一定要在链表的长度范围之内。3 .测试结论:可以正确的对链表进行插入,删除,取长度,输出操作。且插入任意一个元素后,链表的顺序依然是由小到大。4 .总结1 .调试时出现的问题及解决的方法:(1)刚开始时用NULL置空最后一个节点的指针域,发现调试时出现NULL未声明的情况。最后发现用0去置空最后一个节点的指针域,调试成功。(2)刚开始遍历总是不能完全遍历链表。最后发现循环语句中两个句子顺序写反,更正顺序后,调试成功。2 .心得体会:这道题是相对比较基础,目的是实现线性表的基本功能,书上也几乎给出了所有的模板类的定义,但是在自己进行编程时还是出了很多问题。通过这个实例,我对模板类的定义与使用有了个初步的了解,了解了单链表的基本的操作和函数实现。以后必须自己动手编,实现理论与实践相结合,提高自己的编程能力。3 .下一步的改进:这个程序的交互性不强,可以改进的地方应该是可以从外部输入数组而不仅仅是编程者给定。此外,显示的界面不够友好,有待改善,而且可以增加完善的报错机制。此外,也希望老师能在课上给出更多的优化指导。代码#i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论