ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:48.37KB ,
资源ID:7382609      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7382609.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验3 线性表的链式存储讲解.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验3 线性表的链式存储讲解.docx

1、实验3 线性表的链式存储讲解实验报告三 线性表的链式存储一、实验目的:(1)掌握单链表的基本操作的实现方法。(2)掌握循环单链表的基本操作实现。(3)掌握两有序链表的归并操作算法。二、实验内容:(请采用模板类及模板函数实现)1、线性表链式存储结构及基本操作算法实现实现提示 (同时可参见教材p64-p73页的ADT描述及算法实现及ppt)函数、类名称等可自定义,部分变量请加上学号后3位。也可自行对类中所定义的操作进行扩展。所加载的库函数或常量定义:(1)单链表存储结构类的定义:template class LinkList; /前视定义,便于使用友元template class Node fri

2、end class LinkList; /友元类 private: datatype data; Node *next; /此处也可以省略template class LinkList public: LinkList( ); /建立只有头结点的空链表 LinkList(datatype a , int n); /建立有n个元素的单链表 LinkList() /析构函数,释放整个链表空间 int Length(); /求单链表的长度 datatype Get(int i); /取单链表中第i个结点的元素值 void Insert(int i, datatype x); /在单链表中第i个位置插

3、入元素值为x的结点 void destroy() /在单链表中删除所有的结点void PrintList( ); /遍历单链表,按序号依次输出各元素int Empty() /判断表是否为空 private: Node *head; /单链表的头指针;(2)初始化带头结点空单链表构造函数实现输入:无前置条件:无动作:初始化一个带头结点的空链表输出:无后置条件:头指针指向头结点。template LinkList: LinkList( ) head=new Node; head-next=NULL;()利用数组初始化带头结点的单链表构造函数实现输入:已存储数据的数组及数组中元素的个数前置条件:无动

4、作:利用头插或尾插法创建带头结点的单链表输出:无后置条件:头指针指向头结点,且数组中的元素为链表中各结点的数据成员。template LinkList: LinkList(datatype a , int n) int i; Node *s; head=new Node; head-next=NULL; for (i=0; in; i+) s=new Node; s-data=ai; s-next=head-next; head-next=s; ()在带头结点单链表的第i个位置前插入元素e算法输入:插入位置i,待插入元素e前置条件:i的值要合法动作:在带头结点的单链表中第i个位置之前插入元素e

5、输出:无后置条件:单链表中增加了一个结点 template void LinkList:Insert(int i, datatype x) Node *p; int j; p=head ; j=0; /指针p初始化 while (p & jnext; /指针p后移 j+; /找插入点 if (!p) cout i不合法!; else Node *s; s=new Node; s-data=x; s-next=p-next; p-next=s; ()在带头结点单链表中删除第i个元素算法输入:删除第i个结点,待存放删除结点值变量e前置条件:单链表不空,i的值要合法动作:在带头结点的单链表中删除第i

6、个结点,并返回该结点的值(由e传出)。输出:无后置条件:单链表中减少了一个结点 template datatype LinkList:Delete(int i) if(head-next=NULL)Cout”表为空,无法删除!”; Node *p; int j; p=head ; j=0; while (p & jnext; j+; /找到第i-1个结点if (!p | | !p-next) throw “i不合法”; else q=p-next; x=q-data; p-next=q-next; delete q; return x; ()遍历单链表元素算法输入:无前置条件:单链表不空动作:

7、遍历输出单链表中的各元素。输出:无后置条件:无template void LinkList:PrintList( ) Node *p; p=head-next; /p指向首结点 while (p) /p!=NULL coutdata; coutnext; ()求单链表表长算法。输入:无前置条件:无动作:求单链表中元素个数。输出:返回元素个数后置条件:无template int LinkList:Length( ) Node *p ;p= head-next; int i = 0; while(p) p = p-next; i+; return i;()判单链表表空算法输入:无前置条件:无动作:

8、判表是否为空。输出:为空时返回,不为空时返回0后置条件:无template int LinkList:Length() if(head-next=NULL)return 1;return 0;()获得单链表中第i个结点的值算法输入:无前置条件:i不空,i合法动作:找到第i个结点。输出:返回第i个结点的元素值。后置条件:无template datatype LinkList:Get(int i) Node *p; int j; /计数器 p=head-next; j=1; / 或p=head; j=0; while (p & jnext; /工作指针p后移 j+; if (!p) coutdat

9、a;(10)删除链表中所有结点算法(这里不是析构函数,但功能相同)输入:无前置条件:单链表存在动作:清除单链表中所有的结点。输出:无后置条件:头指针指向空 templatevoid linklist:destroy() Node*p; while(head-next!=NULL) p=head; head=head-next; delete p; head-next=NULL; (11)上机实现以上基本操作,写出main()程序:参考p72void main() int a=9,2,3,4,5,6,n=6; LinkList mylist; for(int i=0;in;i+) mylist.

10、Insert(i,ai); coutyichishuchushuju: endl; mylist.PrintList(); coutendl; cout表长为:mylist.Length()endl; coutendl; mylist.Insert(5,8); mylist.PrintList(); coutendl; cout表长为:mylist.Length()endl; mylist.Empty(); mylist.destroy(); coutendl; cout表长为:mylist.Length()endl; 粘贴测试数据及运行结果:2、参考单链表操作定义与实现,自行完成单循环链表的

11、类的定义与相操作操作算法。()利用数组初始化带头结点的单循环链表构造函数实现输入:已存储数据的数组及数组中元素的个数前置条件:无动作:利用头插或尾插法创建带头结点的单循环链表输出:无后置条件:头指针指向头结点,且数组中的元素为链表中各结点的数据成员,尾指针指向头结点。template linklist: linklist(datatype a , int n) node *s; head=new node; head-next=head; for(int i=0;in;i+) s=new node; s-data=ai; s-next=head-next; head-next=s; ()在带头

12、结点单循环链表的第i个位置前插入元素e算法输入:插入位置i,待插入元素e前置条件:i的值要合法动作:在带头结点的单循环链表中第i个位置之前插入元素e输出:无后置条件:单循环链表中增加了一个结点 template void linklist:insert(int i, datatype item) node *p; int j; p=head ; j=0; /指针p初始化 while (p-next!=head & jnext; /指针p后移 j+; /找插入点 if (!p) cout i不合法!;else node*s; s=new node; /申请一个结点 s-data=item; /将

13、插入元素保存在P结点中 s-next=p-next; p-next=s; ()在带头结点单循环链表中删除第i个元素算法输入:删除第i个结点,待存放删除结点值变量e前置条件:单循环链表不空,i的值要合法动作:在带头结点的单循环链表中删除第i个结点,并返回该结点的值(由e传出)。输出:无后置条件:单循环链表中减少了一个结点 template datatype linklist:Delete(int i) if(head-next=head) cout表为空,无法删除!; node *p,*q; int j; p=head ; j=0; while (p-next!=head & jnext; j+

14、; if (!p) coutnext; x=q-data; p-next=q-next; delete q; return x; ()遍历单循环链表元素算法输入:无前置条件:单循环链表不空动作:遍历输出单循环链表中的各元素。输出:无后置条件:无template void linklist:putlist( ) node *p; p=head-next; / p=head; if(p-next=head) coutnext!=head coutdatanext; p=p-next; /coutdata ; (5)上机实现以上基本操作,写出main()程序:void main() int a=45

15、,89,9,13,8,2,n=6; linklist s; for(int i=0;in;i+) s.insert(i,ai); s.insert(1,14); cout第一次遍历链表元素输出:endl; s.putlist(); s.Delete(3); cout第二次遍历表输出;endl; s.putlist();粘贴测试数据及运行结果:、采用链式存储方式,并利用单链表类及类中所定义的算法加以实现线性表La,Lb为非递减的有序线性表,将其归并为新线性表Lc,该线性表仍有序(未考虑相同时删除一重复值)的算法。模板函数:#includetemplateclass linklist; /前视定义

16、templateclass node friend class linklist; private: type data; node*next; ;templateclass linklist private: node*head; public: linklist(); /无参构造函数 linklist(type a,int n); /有参构造函数 void printlist(); /遍历链表 type insert(int i,type item ); /在第i个结点元素前插入元素item int length(); /求链表长度 void sort(); /对新的链表元素排序并输出 t

17、ype get(int i); /获得第i个结点元素;templatelinklist:linklist() head=new node; head-next=NULL;templatelinklist:linklist(type a,int n) node *s; head=new node; head-next=NULL; for(int i=0;in;i+) s=new node; s-data=ai; s-next=head-next; head-next=s; templatetype linklist:insert(int i,type item) node *p; int j=0

18、; p=head ; while (p & jnext; /指针p后移 j+; if (!p) couti不合法!; else node*s; s=new node; /申请一个结点 s-data=item; /将插入元素保存在s结点中 s-next=p-next; p-next=s; return item; template int linklist:length( ) node *p; p=head; int n=0; while(p!=NULL) p=p-next; n+; return n;templatetype linklist:get(int i) node *p; int j

19、=0; p=head; while (p & jnext; j+; if (!p) coutdata;templatevoid linklist:sort() node *p,*q; type temp; p=head; while(p) q=p-next; while (q) if(p-dataq-data) temp=p-data; p-data=q-data; q-data=temp; q=q-next; p=p-next; template void linklist:printlist( ) node *p; p=head-next; while (p) coutdatanext;

20、void main() int a=1,66,0,5,2,6,7; int b=3,4,6,7,8,76; linklist La(a,7); linklist Lb(b,6); cout第一组元素输出:; La.printlist(); coutendl; cout第二组元素输出:; Lb.printlist(); coutendl; for (int i=2;iLb.length()+1;i+) La.insert(i,Lb.get(i); /将数组a的元素插入到b当中去 cout合并后的元素为:endl; La.sort(); /排序 La.printlist(); coutendl;

21、cout合并后元素个数为: La.length()endl;粘贴测试数据及运行结果:选做题:、按一元多项式ADT的定义,实现相关操作算法:ADT PNode isData 系数(coef)指数(exp)指针域(next):指向下一个结点Operation暂无end ADT PNodeADT Polynomial isData PNode类型的头指针。Operation Polynomail 初始化值:无 动作:申请头结点,由头指针指向该头结点,并输入m项的系数和指数,建立一元多项式。 DestroyPolyn 输入:无前置条件: 多项式已存在动作:消毁多项式。输出:无后置条件:头指针指向空 P

22、olyDisplay 输入:无前置条件: 多项式已存在,不为空动作:输出多项式各项系数与指数输出:无后置条件:无AddPoly输入:另一个待加的多项式前置条件:一元多项式pa和pb已存在。动作及后置条件:完成多项式相加运算,(采用pa=pa+pb形式,并销毁一元多项式pb)输出:无end ADT Polynomial、实现一元多项式的减法,操作描述如下:SubPoly输入:待减的多项式pb前置条件:一元多项式pa和pb已存在。动作及后置条件:完成多项式减法运算,即:pa=pa-pb,并销毁一元多项式pb。输出:无、参考P74-P79页双向链表的存储结构定义及算法,编程实现双向链表的插入算法和删

23、除算法。#includetemplate class linklist;template class node friend class linklist; private: type data; node *next,*prior;template class linklist public: linklist( ); /建立只有头结点的空链表 linklist(type a , int n); /建立有n个元素的双向链表 linklist() /析构函数,释放整个链表空间 int length(); /求双向链表的长度 type insert(int i,type x); /在双向链表中第i个位置插入元素值为x的结点 type Delete(int i); /删除第i个位置的元素 void printlist( ); /遍历双向链表,按序号依次输出

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1