版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构上机实验报告 题目:用单链表解决约瑟夫问题 学生姓名 学生学号 学院名称 计算机学院 专 业 计算机科学与技术 时 间 目 录 第一章 需求分析 11.1 原题表述 11.2 问题解决方案 1 第二章 概要设计 22.1 抽象数据类型 22.2 主要算法描述 22.3 主要算法分析 2 第三章 详细设计 33.1 程序代码 3 第四章 调试分析 54.1 出现的问题及解决方法 5 第五章 测试分析 65.1 测试样例 6 第六章 未来展望与思考 7计算机学院2013级数据结构上机实验报告第1章 需求分析1.1 原题表述一个旅行社要从n个旅客中选出一名旅客,为他提供免费的环球旅行服务。旅
2、行社安排这些旅客围成一个圆圈,从帽子中取出一张纸条,用上面写的正整数m(<n)作为报数值。游戏进行时,从第s个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人被淘汰出列,然后从他顺时针方向上的下一个人开始重新报数,如此下去,直到圆圈中只剩下一个人,这个最后的幸存者就是游戏的胜利者,将得到免费旅行的奖励。1.2 问题解决方案 由于当某个人退出圆圈后,报数的工作要从下一个人开始继续,剩下的人仍要是围成一个圆圈,可以使用循环表;由于退出圆圈的工作对应着表中结点的删除操作,对于这种删除操作频繁的情况,应该选用效率较高的链表结构;为了程序指针每一次都指向一个具体的代表一个人的结点而不
3、需要进行判断,链表不带表头结点。所以,对于所有人围成的圆圈所对对应的数据结构采用一个不带头结点的循环链表来描述。第二章 概要设计2.1 抽象数据类型adt josephus 数据对象:d = ai = ai | ai elemset,i = 1,2,3,n, n >= 0数据关系:s = < ai - 1 ,ai > | ai -1 ,ai d, i = 2,3,4,,n基本操作:creatlist(n)操作结果:构建一个含n个结点的单循环链表startnum(s)初始条件:单循环链表已存在操作结果:将头指针指向第s个结点deletelist(m)初始条件:单循环链表已存在操
4、作结果:依次输出被删除的数到m的元素及最后剩余的元素开始2.2 主要算法描述被删除的数到m的元素及最后剩余的元素结束将头指针指向第s个结点构建含n个结点的单循环链表n, s, m 图 2-12.3 主要算法分析creatlist(n)一重循环 时间复杂度 = o(n)startnum(s) 一重循环 时间复杂度 = o(n)deletelist(m) 二重循环 时间复杂度 = o(m*n) 第三章 详细设计3.1 程序代码 #include<stdio.h> #include<malloc.h> typedef struct josephus int data; str
5、uct josephus *next; josephus, *linklist; linklist p, r, last = null; /构造一个不带头结点的循环链表,并赋值1n void creatlist(int n) for(int i = 1; i <= n; i+) p = (linklist)malloc(sizeof(josephus); /申请一个新的链结点 p -> data = i;/存放第i个结点的元素 if(last = null) last = p; else r -> next = p; r = p; p -> next = last; p
6、 = last; /循环链表建立完成 /将头指针p指向第s个人 void startnum(int s) for(int i = 1; i < s; i+) r = p; p = p -> next; /此时p指向第1个出发结点 /依次输出被删除的元素及最后剩余的元素。 void deletelist(int m) while(p -> next != p) for(int i = 1; i < m; i+) r = p; p = p->next; /p指向第m个结点,r指向第m-1个结点 r -> next = p -> next;/删除第m个结点
7、printf("number %d is outn", p->data);/依次输出删除结点的元素 free(p);/释放被删除结点的空间 p = r -> next;/p指向新的出发结点 printf("number %d is outn", p->data);/输出最后一个结点的元素 int main() int n, m, s; printf("enter n:n"); scanf("%d", &n); printf("enter m:n"); scanf(&qu
8、ot;%d", &m); printf("enter s:n"); scanf("%d", &s); creatlist(n); startnum(s); printf("* solve josephus problem *n"); deletelist(m); printf("* end *n"); return 0; 第四章 调试分析4.1 出现的问题及解决方法1. 由于对循环链表算法的理解不够透彻,在构建循环链表的前期,指针指向混乱,导致程序无法通过编译。2、由于建立的是带头结点的单
9、循环链表,导致输出的结果许多是错的,删除头结点,即建立的是不带头结点的单循环链表解决。3、运行出现输出元素顺序与样例不同,调试时发现数数出错了,改为每次数 m-1 次。 4、程序运行停止前出现错误对话框,百度发现可能是内存泄露的原因。5、在循环链表的使用中,由于指针使用占主导地位,理解节点的前后关系有点复杂,偶尔会出现小错误。以后吸取教训,在复杂循环时,最好通过图形的辅助,以使编程过程思路清晰。第五章 测试分析5.1 测试样例 测试样例 1:输入m = 10,n = 4,s = 3图 5-1 测试样例 2:输入m = 13, n = 3, s = 4图 5-2第六章 未来展望与思考通过这次数据结构编程实验,我初步了解了约瑟夫问题的求解方法,并熟悉了带尾指针的单循环链表,练习了利用尾插法构建链表的方法。在约瑟夫问题解决的过程中,复习了链表的出列操作,并通过编译时暴露出的问题,对指针使用方面存在的盲点进行了及时的查漏补缺,有了许
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年蔬菜宝宝大班教案
- 水闸闸门(平板钢闸门、弧形闸门)吊装及止水橡皮安装施工组织设计方案
- 2025-2026学年数字抱抱团教案
- 2025-2026学年圈住快乐教案
- 2025-2026学年日本教学板书设计
- 2025-2026学年认识西瓜教案社会
- 8.13智能物联系统的硬件搭建(教学设计)-信息技术八年级下册同步备课(浙教版)
- 2025-2026学年英语教学评价作业设计
- 2026年入党思想报告自传(3篇)
- (2026版)医院医保培训计划
- 2025清华附中小升初分班考试说明+真题节选(语数英)
- 新版2026年高考物理(河南卷)真题详细解读及评析
- 2026年全国保密教育线上培训考试题库(含标准答案)
- 2026广东佛山市季华实验室科研及公共技术部门招聘10人考试模拟试题及答案详解
- 锅炉受热面防磨喷涂技术方案
- 2026辽控集团所属辽宁九夷锂能股份有限公司招聘20人考试参考试题及答案详解
- 国企招聘题库
- 部编版六年级下册道德与法治全册教案
- 2026年东风汽车校招人才测评题库
- 工程项目质量首件样板标准图集(安装分册)
- (正式版)T∕GDSTD 028-2026 广东省土地储备入库出库指引
评论
0/150
提交评论