网站大量收购闲置独家精品文档,联系QQ:2885784924

约瑟夫环C语言数据结构实验报告.docx

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
约瑟夫环C语言数据结构实验报告

约瑟夫环问题 实验目的 约瑟夫问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。 基本要求 利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。 实验内容 利用带头结点的单循环链表设计一个程序,以人机交互方式执行,用户制定约瑟夫环游戏的总人数n和初始报数上线m,然后输入每个人所持有的密码password。模拟约瑟夫环,从头开始报数,直到所有人都出列,系统按照出列顺序给出编号。 实验平台 Microsoft Visual C++ 设计流程 利用单循环链表求解本问题,先创建一个有n+1个结点(包括一个头结点)组成的单循环链表,依次录入n个密码值password。然后从第一个结点出发,连续略过m-1个结点,将第m个结点从链表中删除,并将第m个结点的密码值作为新的m值,接着再次从下一个结点出发,重复以上过程,直至链表为空。 源代码清单 #includestdio.h #includemalloc.h typedef struct list { int num; int passward; struct list *next; }node; node *creatlist(int n) { node *p,*q,*head; int i=1; head=(node *)malloc(sizeof(node)); head-num=i; printf(请输入第1个人的密码:); scanf(%d,head-passward); p=head; for(i=2;i=n;i++) { q=(node *)malloc(sizeof(node)); if(q==0)return 0; printf(请输入第%d个人的密码:,i); scanf(%d,q-passward); q-num=i; p-next=q; p=q; } p-next=head; return head; } void josephus(node *l,int k) { int i; node *p=l,*q,*s; printf(\n-----------按照出列顺序输出每个人的编号-----------\n); while(p-next!=p) { for(i=1;ik;i++) { q=p; p=p-next; } printf(第%d个人出列,所持密码是%d\n,p-num,p-passward); k=p-passward; s=p; q-next=p-next; p=p-next; free(s); } printf(第%d个人出列,所持密码是%d\n,p-num,p-passward); printf(\n); } void main() { node *l; int n,k; printf(请输入实验人数n:); scanf(%d,n); printf(请输入初始报数上限m:); scanf(%d,k); printf(\n); l=creatlist(n); josephus(l,k); } 调试与测试结果

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档