1、北邮数据结构实验 第一次实验 线性表1实验要求(1) 实验目的通过选择下面题目进行实现,掌握如下内容: 熟悉C+语言的基本编程方法,掌握集成编译环境的调试方法 学习指针、模板类、异常处理的使用 掌握线性表的操作的实现方法 学习使用线性表解决实际问题的能力(2) 实验内容根据线性表的抽象数据类型的定义,选择下面任一种链式结构实现线性表,并完成线性表的基本功能。线性表存储结构(五选一):1、 带头结点的单链表2、 不带头结点的单链表3、 循环链表4、 双链表5、 静态链表线性表的基本功能:1、 构造:使用头插法、尾插法两种方法2、 插入:要求建立的链表按照关键字从小到大有序3、 删除4、 查找:按
2、位置查找和按值查找5、 获取链表长度6、 销毁7、 其他:可自行定义编写测试main()函数测试线性表的正确性。2. 程序分析2.1 存储结构 储存结构: 单链表a3 1080Ha110C0Ha4a21000H地址 内存单元结点 1000H 结点头指针 1020H结点 1080H 10C0H结点2.2 关键算法分析一、关键算法:1头插法 自然语言描述:a:在堆中建立新结点b:将ai写入新结点的数据域c:修改新结点的指针域d:修改头结点的指针域。将新结点加入链表中。 2.尾插法 伪代码描述: a: Node *s=new Node b:s-data=ai; c:r-next=s; d:r=s;
3、3.析构/删除函数 a:Node*p=front b:while(p) c:front=p d:p=p-next e:delete front 4.按位查找函数 a:Node*p=front-next;j=1; b:while(p&j!=1) b1:p=p-next; b2:j+: c:if(!p) throw”end” d:return p; 5.按值查找函数 a:Node *p=front-next;j=1; b:while(p) b1: if(p-next=x) return j p=p-next; j+ c:return “error” 6.插入函数 a:Node *s=new Nod
4、e ; b:s-data=p-data c:s-next=p-next; d:p-next=s e:p-data=x 7.删除函数 a:q=p-next; b:p-next=q-next c:x=q-data d:delete q 8.遍历打印函数 If front-next=NULL Throw “an empty list” Node*temp=front-next; While(temp-next) coutdatanext; 9.获取链表长度函数 Int n=0; If front-next=NULL n=0; else Node*temp=front-next; While(temp
5、-next) n+; temp=temp-next; Return n; 二、代码详细分析 1.删除算法:图1 删除结点示意图算法步骤:从第一个结点开始,查找第i-1个元素,设为p指向该a结点;设q指向第i个元素:q = p-next;摘链,即将q元素从链表中摘除:p-next = q-next;保存q元素的数据:x = q-data;释放q元素:delete q; 2.头插法 关键代码: a:在堆中建立新结点: Node *s=new Node; b:将ai写入到新结点的数据域 s-data=ai; c:修改新结点的指针域 s-next=front-next; d:修改头结点的指针域 fro
6、nt-next=s; front s front 3.尾插法 关键代码: a:在堆中建立新结点 Node*s=new Node ; b:将数据写入结点的数据域 s-data=ai; c将新结点加入到链表中:r-next=s; d 修改尾指针 r=s; r Front Front S 4.查找算法 关键代码: a Node*p=front-next;int j=1; b while(p&j!=1) p=p-next; j+; front P(j=1) P(j=2) P(j=i) P(j=n)三、计算关键算法的时间、空间复杂度 头插法/尾插法 O(n); 按位/按值查找 O(n); 插入操作 O(
7、n);3. 程序运行结果 运行结果:流程图:开始初始化一个对象初始化一个整数数组,作为赋值准备 分别利用头插法和尾插法初始化,并用遍历打印函数来显示数值执行删除函数,之后用遍历打印函数测试是否真的删除执行插入函数,之后用遍历打印函数测试是否真的插入执行按位查找和按值查找结束问题规模的数量级为10,插入元素位置为第10个,删除第3个4. 总结 1.调试时出现的问题及解决方法: 按位查找时,返回值与计数器j的关系没有找对,导致返回值不在链表中,解决:重新计算两者关系。2.心得体会通过这次实验,我熟悉了链表的储存结构以及各种操作3.改进:适当简化某些过程,使程序更精简。 源文件:#includeus
8、ing namespace std;template struct Node T data; struct Node*next; ; template class LinkList public: LinkList()front=new Node;front-next=NULL; void hLinkList(T a,int n);/头插法 void rLinkList(T a,int n);/尾插法 LinkList();/析构/删除 int GetLength();/获取长度 Node *Get(int i); int Locate(T x); void Insert(int i,T x)
9、; T Delete(int i); void PrintList(); private: Node*front; ; template void LinkList:hLinkList(T a,int n) front=new Node; front-next=NULL; for(int i=n-1;i0;i-) Node *s=new Node; s-data=ai; s-next=front-next; front-next=s; ; template void LinkList:rLinkList(T a,int n) front=new Node; Node*r=front; for(
10、int i=0;i=n-1;i+) Node *s=new Node ; s-data=ai; r-next=s; r=s; r-next=NULL; ; template LinkList:LinkList() Node*temp=front; while(temp) front=temp; temp=temp-next; delete front; ; template Node*LinkList:Get(int i) Node*p=front-next; int j=1; while(p&j!=i) p=p-next; j+; if(!p) throw查找位置非法; else retur
11、n p; ; template int LinkList:Locate(T x) Node*p=front-next; int j=1; while(p) if(p-data=x)return 4*j; p=p-next; j+; ; return -1; /对查找位置异常的处理,返回-1 ; template void LinkList:Insert(int i,T x) Node*p=front; if(i!=1)p=Get(i-1); if(p) Node*s=new Node; s-data=x; s-next=p-next; p-next=s; else throw插入位置错误; ;
12、 template T LinkList:Delete(int i) Node*p=front; if(i!=1)p=Get(i-1); Node*q=p-next; p-next=q-next; T x=q-data; delete q; return x; ; template void LinkList:PrintList() /遍历打印链表元素 if(front-next=NULL) cout该链表为空链表endl; Node*temp=front-next; while(temp-next) coutdatanext; ; template int LinkList:GetLengt
13、h() int n=0; if(front-next=NULL) n=0; else Node*temp=front-next; while(temp-next) n+; temp=temp-next; return n; ; void main() LinkList linklist1; int all100; for(int i=0;i100;i+) alli=2*i; ; linklist1.hLinkList(all,50); cout利用遍历函数打印输出所有的数值:endl; linklist1.PrintList(); coutendl; int m=linklist1.GetLength(); cout利用获取长度获取该链表的长度为:endlm; coutendl; cout利用查找函数查找20所在的地址为:endllinklist1.Get(20)endl; cout利用按位查找函数查找第30个数据为:endllinklist1.Locate(30)endl; cout插入函数,插入后遍历打印结果为:endl; linklist1.Insert(10,3445); linklist1.PrintList(); coutendl; cout删除某一位后的结果为:endl; linklist1.Delete(3); linklist1.PrintList();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1