数据结构约瑟夫环的课程设计报告.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构约瑟夫环的课程设计报告

数学与计算机学院 数据结构课程设计 设计题目:约瑟夫环 一.选题背景: 题目:约瑟夫环 问题描述: 编号为1,2,…..,n的n个人按顺时针方向围坐圈,每个人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新重新从1报数,如此下去,直至所有人全部出列为止。 基本要求: ⑴ 建立模型,确定存储结构; ⑵ 对任意 n个人,密码为 m ,实现约瑟夫环问题; ⑶ 出圈的顺序可以依次输出,也可以用一个数组存储。 设计指导思想: 首先,设计实现约瑟夫环问题的存储结构。由于约瑟夫环问题本身具有循环性质,考虑采用循环链表,为了统一对表中任意结点的操作,循环链表不带头结点。?? 其次,建立一个不带头结点的循环链表并由头指针 first 指示。 最后,设计约瑟夫环问题的算法。下面给出伪代码描述,操作示意图如图 2-1 所示。 ? 二.方案论证: 本方案通过建立单循环链表模拟了约瑟夫问题;首先,建立一个结构体node,然后给他开辟一个储存空间;利用头指针head标记链表,利用尾指针向后移将建立的结点连接成我们需要的单循环链表, 过程如下: 约瑟夫问题中的人数个数即为链表的长度,链表中node-num 编号n,node-data为每个人的密码。建立单循环链表后,通过初始报数上限找到出列的结点,输出该结点的node-num值,将该结点中的data中数作为新密码开始下一个步的开始,将该结点从链表中删除,并释放该结点的空间。重复此过程,直到剩下最后一个结点,就直接将该结点中的num值输出,删除该结点,并释放该结点的空间。输出的num值即为约瑟夫中人的编号。 三.过程论述: typedef struct node { int data; int num; struct node *next; }listnode; 定义一个结构体用来储存学生的编号和所携带的密码 for(i=1;i=n;i++) { printf(输入第%d号同学的密码:,i); scanf(%d,j);//输入学生所带密码 p1-next=(listnode*)malloc(sizeof(listnode));//建立一个新的空间,并将它的地址赋给p1-next p1=p1-next; p1-data=j; p1-num=i;//对结点的num和data成员赋值 p1-next=head-next;//构成单循环链表 } 定义指针p1,然后建立一个新结点并将p1-next指向它的地址,然后将这个地址赋给p1,最后将head-next赋给p1-next,构成一个单循环链表,并不断在尾部插入新的结点,直至所有人都进入循环链表中,而且在循环的过程中给结点的num和data成员赋值 do { k=1; while(k!=m)//当k==m时一轮报数结束 { p1=p1-next; k++; }//报数过程中将指针p1指向下一位 p2=p1-next; p1-next=p2-next;//将报m的人的结点从链表中删去 printf(编号为%d的人出列,他的密码%d作为新的m值\n,p2-num,p2-data);//报数为m的人出列 m=p2-data;//报数为m的人的密码作为新的m值 free(p2);//释放报m的人的结点 }while(p1-next!=p1);//当p1-next指向的地址是它自己的地址,所有报数结束 定义指针p1用以循环链表,定义变量k计数,指针p1每移动一次,k加1,直到k==m时,输出指针p1所指向的节点序号,也就是令这个“人”出列,p2指向该节点上一节点,令上一节点next域指向该节点下一节点,然后删除该节点,令头节点p1指向该节点下一节点作为再次报数初始“人”,再令k归1,继续循环。知道p1-next= =p1时,表示所有“人”出列完毕,删除最后的节点后跳出循环 四.结果分析: 测试数据: n=4, 4个人的密码依次为4, 3,8, 6, 首先m=6 输出结果: 测试数据: n=7,7个人的密码依次为3,1,7,2,48,4,首先m=20 输出结果:

文档评论(0)

sanshengyuan + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档