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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构读书报告.docx

1、数据结构读书报告一、需求分析1.问题描述:设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列,如此反复直到所有的人全部出列为止。二、程序分析2.1 存储结构 存储结构:循环链表2.2 关键算法分析【设计思想】首先,设计实现约瑟夫环问题的存储结构。由于约瑟夫环本身具有循环性质,考虑采用循环链表,为了统一对表中任意节点的操作,循环链表不带头结点。循环链表的结点定义为如下结构类型:struct Node int number; Node *next;其次,建立一个不带头结点的循环链表并由头指针first指示。最后,设计约瑟夫环问

2、题的算法。【伪代码】1、工作指针first,r,s,p,q初始化2、输入人数(n)和报数(m)3、循环n次,用尾插法创建链表 Node *q; for(int i=1;inumber=i; p-next=NULL; if(i=1) L=q=p; else q-next=p; q=q-next; q-next=L; if(L!=NULL)return(L); 4、输入报数的起始人号数k; 5、Node *q = new Node;计数器初始化i=1;6、循环n次删除结点并报出位置(其中第一个人后移k个) 当inext; 删除p结点的后一结点qq=p-next; p-next=q-next; *L

3、 = p-next; 报出位置后Delete q; 计数器i+;【复杂度】for(int i=1;inumber=i; p-next=NULL; if(i=1) L=q=p; else q-next=p; q=q-next; 时间复杂度:O(n)if(i=1) i+=LengthList(*L); Node *p; p=*L; int j=0; while(jnext;j+; q = p-next; p-next=p-next-next; *L = p-next; return(q);时间复杂度:O(n2)算法的空间复杂度:O(n2)三、详细设计#includeusing namespace

4、std;struct Node/循环节点的定义 int number;/编号 Node *next;Node *CreateList(Node *L,int &n,int &m);/建立约瑟夫环函数void Joseph(Node *L,int n,int m);/输出每次出列号数函数Node *DeleteList(Node *L,int i,Node *q);/寻找每次出列人的号数 int LengthList(Node *L);/计算环上所有人数函数 void main()/主函数 Node *L; L=NULL;/初始化尾指针 int n, m; coutn;/环的长度 if(n1)c

5、out请输入正整数!;/人数异常处理 else coutm; if(m1)cout请输入正整数!;/号数异常处理 else L=CreateList(L,n,m);/重新给尾指针赋值 Joseph(L,n,m); system(pause);Node *CreateList(Node *L,int &n,int &m)/建立一个约瑟夫环(尾插法) Node *q; for(int i=1;inumber=i; p-next=NULL; if(i=1) L=q=p;/工作指针的初始化 else q-next=p; q=q-next; q-next=L; if(L!=NULL)return(L);

6、/返回尾指针 else cout尾指针异常!endl;/尾指针异常处理void Joseph(Node *L,int n,int m)/输出每次出列的人 int k; coutk; if(kn)cout请输入1-n之间的数endl; else coutn出列顺序:n; for(int i=1;in;i+) Node *q = new Node; if(i=1) q=DeleteList(&L,k+m-1,q);/第一个出列人的号数 else q=DeleteList(&L,m,q); cout号数:numberendl; delete q;/释放出列人的存储空间 cout最后一个出列号数是:n

7、umberendl;/输出最后出列人的号数 Node *DeleteList(Node *L,int i,Node *q) /寻找每次出列的人 if(i=1) i+=LengthList(*L);/顺序依次出列情况的处理方式 Node *p; p=*L; int j=0; while(jnext;j+; q = p-next; p-next=p-next-next; *L = p-next; return(q);int LengthList(Node *L)/计算环上的人数 if(L)cout尾指针错误!next; while(p!=L) i+; p=p-next; return(i);四、调

8、试结果2.测试条件:如上图所示,人数为20人,所报数为6,第一个报数的人是1号。3.测试结论:得出最后出列的人是20号,与算得的结果一致,证明程序正常运行,能够解决一般的约瑟夫环问题。4.总结 1.调试时出现的问题及解决办法:利用带头结点的尾插法建立链表求解的时候,头节点的作用无法确定,导致编译通过,但是运行之后的结果都不是正确的运行结果。苦苦思索,包括和同学讨论,一直没能解决,最后决定改用另一种存储方法,将头节点直接改成NULL,最终测试的结果是正确的。(但是还未能完全理解原因是什么)用函数返回存储节点的地址的时候,函数中的一句没有问题的语句出现访问错误,更改函数从而解决了问题。2.心得体会

9、:这次做数据结构作业,真是令我大伤脑筋啦,在书上网上看了好多的相关的东西才小有启发,当然也想过很多别的问题,最后觉得约瑟夫环问题是一个比较容易弄出来,但又在一定程度上检验学习成果的问题,在编写程序的过程中最令人头痛的是不断弹出来的error,让人很头疼,同时在完成作业的过程中也明白了其实看别人的程序和自己编写程序根本就是两码事,编写程序需要有自己的构思,想法,就是用自己的脚走出来的,同时我也感觉到在做事的时候向别人虚心咨询问题的重要性,总之,这个作业完成的有点艰难,甚至有一些不足之处但终究也让我受益匪浅。3.下一步的改进: 希望下一次自己可以,在做作业的时候可以完成一些更复杂的问题,而且在这个过程中可以更多的有自己的想法而不是网上或是别的地方的东西,在遇到真正的难题的时候再去请教别人。

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

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