约瑟夫问题的代码(链表的运用).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文档。上传文档
查看更多
约瑟夫问题的代码(链表的运用)

有m个海盗得到了一笔宝藏,但海盗头想自己独吞。于是他发明了一种“公平”的方法来分财宝。他告诉大家,明天日出的时候我们围成一圈开始数数字,从我开始。我的编号是1。每次数到数字n,就把这个海盗扔进海里。最后一个留下来的海盗独得全部财宝。如果m10且n3,请求出最小的m和n。 代码: #includestdio.h #includestdlib.h struct ren { int num; struct ren *next; }; struct ren *head; void main() { void renshu(); int flag,j; flag=1; while(flag==1) { renshu(); printf(是否还有继续:\n 1.是\n 2.否\n); scanf(%d,j); flag=j; if(j==1) { system(pause); system(cls); } } } void renshu() { int flag,i,m,n,k,t,q;//m是人数,N是要丢掉的第几个人,I是编号,q=2证明循环没问题,q=1说明输入的数据出错 struct ren *p,*d; t=1;//t用来计数的 flag=1;//flag=1表示不符合要求,flag=2表示可以 while(flag==1) { printf(输入海盗人数:);//输入海盗人数 scanf(%d,m); printf(输入要丢掉的数字:);//输入第几个人要扔掉 scanf(%d,n); if(m10n3)//判断输入的数据是否符合要求 { flag=2;//跳出while循环 } else { printf(不符合要求,请重新输入!\n); } // flag=2; } /////////////////////////// for(i=1;i=m;i++)//创建链表 { if(i==1) { p=(struct ren *)malloc(sizeof(struct ren));//头节点 p-num=i; p-next=NULL; head=p; d=p; } else { p=(struct ren *)malloc(sizeof(struct ren)); p-num=i; p-next=NULL; d-next=p; d=p; } } //////////////////////////////开始循环 d=head; printf(共有%d个人\n,i-1); while(d)//只是显示人数 { printf(%d\n,d-num); d=d-next; } i=n; d=head; p=head; while(t!=m)//没进行一次就丢掉一个人 { while(i1) { d=p; p=p-next; if(p==NULL) { p=head; } i=i-1; } if(p==head) { printf(释放了%d号\n,p-num); printf(出错!\n); q=0; k=t;//看看是哪里的T出错 t=m;//结束程序 } else { if(p-next!=NULL)//链表未结束 { d-next=p-next; printf(释放了%d号\n,p-num); t=t+1; free(p); p=NULL; p=d-next; i=n; } else//链表结束 { d-next=NULL; printf(释放了%d号\n,p-num); t=t+1; q=2;//释放成功 free(p); p=NULL; p=head; i=n; } } } if(q==2) { printf(确定人数为%d个!\n丢掉的数字是%d\n,m,n); } } 解析: 此问题的解决需要运用链表的相关用法。所以我们要熟练掌握链表的运用。 首先理清思路,这类问题需要一个链表,并且实现链表的循环,这样才能解决问题。接下来我就讲解链表的部分。 现希望你能看清楚这代码,并且现运行这代码。 接下来我只说链表部分。 for(i=1;i=m;i++)//创建链表 { if(i==1)

文档评论(0)

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

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

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档