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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

实验二报告线性表的链式存储.docx

1、实验二报告线性表的链式存储 数据结构实验报告 (实验二) 专业:_ _ 班级:_ _ 姓名:_ _ 学号:_ _ 指导老师:_ _ 评分:_ 实验二 线性表的链式存储一、 实验目的1. 掌握线性表的链式存储结构。2. 能熟练地利用链式存储结构实现线性表的基本操作。3. 能熟练地掌握链式存储结构中算法的实现。二、 实验内容1. 分别用头插法和尾插法建立带头结点的单链表。2. 实现单链表上的插入、删除、修改、查找、计数、输出等基本操作。3. 解决约瑟夫问题:假设有n个人按1、2、3、n的顺序围成一圈,现在,从第s个人开始按1、2、3、m的顺序报数,数到m的人出圈,接着从出圈的下一个人开始重复此过程

2、,直到所有人出圈为止。试用循环链表解决这个问题。三、算法描述12:程序中先是以一个LNode结构体类型定义结点的式的存储结构定义数据类型,再建立单链表,声明一个变量LNode和一个指针变量*LinkList。再定义实现单链表基本操作的子函数,包括初始化、求长度、遍历、查找、修改、插入、删除等功能实现的函数,在主函数中调用这些子函数。3. 将n个人按顺序编号排成一列,形成一个单循环链表。程序以模板形 式实现,先定义类CircList,在类外定义相应功能的实现。getData函数实现对应出列编号的返回,再由Josephus函数调用输出,输出后删除该结点,再重新定义一个新结点作为下一个结点,从新定义

3、的结点开始利用循环找到出圈人位置的结点,输出该结点的信息,再在链表中删除该结点,接着从删除的结点的后面重复此步骤,直到链表中剩下一个结点时停止循环,再把链表中的最后一个结点删除。按循环时输出的的顺序输出所有出列的编号。4、程序清单12:#include using namespace std;const int Max=100;typedef struct LNode /定义存储结构 char data; struct LNode *next;LNode,*LinkList;/建立单链表int initlist(LinkList &a) LinkList s; s=new LNode; /if

4、(!s) / return 0; a=s; s-next=NULL; return 0;/输入数据int Indata(LinkList &a) int n; cin n; if(nMax) cout 你输入的长度不正确,请重新输入: ; Indata(a); else cout 请输入链表元素: ; char b; LinkList s,p; p=a; for(int i=1;ib; s=new LNode; s-data=b; s-next=NULL; p-next=s; p=s; return 0;/求链表的长度int length(LinkList a) LinkList p; int

5、 i; p=a; for(i=0;p-next!=NULL;i+) p=p-next; return i;/遍历链表int PrintList(LinkList a) if(length(a)=0) exit(1); LinkList p; for(p=a-next;p-next!=NULL;p=p-next) cout data ; cout data; return 0;/按位查找元素char Get(LinkList a,int i) LinkList p=a; int j; for(j=1;jnext; return p-data;/修改链表元素int Exchange(LinkLis

6、t a,int i,char k) LinkList p=a; int j; for(j=1;jnext; p-data=k; return 0;/在指定位置插入元素int Insert(LinkList &a,int i,char k) LinkList p=a; LinkList s; int j; for(j=1;jnext; s=new LNode; s-data=k; s-next=p-next; p-next=s; return 0;/删除指定位置的元素int Delete(LinkList &a,int i) LinkList s,p=a; int j; for(j=1;jnex

7、t; s=p-next; p-next=p-next-next; delete s; return 0;void main() LinkList s; void menu(); menu(); initlist(s); char b; int i; int h=1; while(h) int k; cin k; switch(k) /多分支选择结构 case 1: /输入数据 cout 输入链表长度: ; Indata(s); cout endl; cout 链表为: ; PrintList(s); menu(); break; case 2: /按位查找元素 cout i; if(ileng

8、th(s) cout i; cout 该位置的元素是: Get(s,i) endl; menu(); break; case 3: /修改链表元素 cout i b; if(ilength(s) cout i; Exchange(s,i,b); cout 修改后的链表: ; PrintList(s); cout endl; menu(); break; case 4: /在指定位置插入元素 cout i b; if(ilength(s) cout i; Insert(s,i,b); cout 插入后的链表: ; PrintList(s); cout endl; cout 新链表总长度: ; c

9、out length(s); menu(); break; case 5: /删除指定位置的元素 cout i; if(ilength(s) cout i; Delete(s,i); cout 删除后的链表: ; PrintList(s); cout endl; cout 新链表总长度: ; cout length(s); menu(); break; default: /结束程序 cout 程序结束,请按任意键退出! endl; exit(1); /菜单函数void menu() cout endl; cout endl; cout -菜单- endl; cout 1.初始化链表 endl;

10、 cout 2.按位查找元素 endl; cout 3.修改指定位置元素 endl; cout 4.在指定位置插入元素 endl; cout 5.删除指定位置的元素 endl; cout 6.退出程序 endl; cout - endl; cout 请选择: ;输出结果:1.初始化链表 2.查找元素 3.修改指定位置元素 4.插入元素 5.删除指定位置的元素 6.结束程序 3:#includeusing namespace std;template class CircList public: CircList ( T value,int k ); /构造函数 CircList (T d=0,

11、CircList *next=NULL):data (d), link (next) /结点构造函数 T getData ( ) const return current-data; /返回当前结点值 void Firster ( ) current = first; /设置当前指针为头指针 void Next ( ) current=current-link; /将当前指针指向当前结点的后继 void Insert ( const T & value ); /插入新结点 void Delete ( ); /删除当前结点 void Josephus(int n,int m); /约瑟夫问题的解

12、决,按顺序输出出列编号private: CircList *first, *current, *last; T data; CircList *link;/循环链表的构造template CircList:CircList ( T value,int k ) first=last=new CircList(value); first-link=first; current=NULL;/插入新结点template void CircList:Insert( const T &value ) if(current=NULL) current=first-link=new CircList(valu

13、e,first); else CircList *newnode=new CircList(value,current-link); if(current-link=first) last=newnode; current-link=newnode; current=current-link; /删除当前结点,进入下一个结点template void CircList:Delete ( ) CircList *p=first ,*q=last; while(p-data!= getData () q=p;p=p-link; current=q-link=p-link; if(p=first)

14、first=current; if(p=last) last=q;/约瑟夫问题的解决,按顺序输出出列编号template void CircList:Josephus(int n,int m) Firster(); cout endl; cout出列的顺序:; cout endl; for(int i=0;in;i+) for(int j=0;jm-1;j+) Next(); if(i!=n) coutgetData() ; Delete(); void main() CircList clist(1,10000); int n,m; coutn; cout endl; coutm; for(int i=2;i=n;i+) clist.Insert(i); clist.Josephus(n,m); cout endl; cout endl;输出结果:4、心得体会 这两个实验,均是对链表实现的应用,主要是对单链表和单循环链表基本操作的运用,实现时特别要注意的是链表存储结构的结点的使用,通过这两个实验的实践操作,我发现结点的运用是相对较难的部分,使用时需要特别小心。通过这两个实验,我对链表的运用有了更深一层的认识,但还是感觉底气足,还需更加努力去学习。

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

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