- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一.问题描述
约瑟夫环问题的一种描述是:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
二.基本要求
利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限。??
三.需求分析
1:用一个循环链表实现n个人按顺时针排成一圈,每个人看作一个节点,每个节点都是一个结构体类型,包含三个域: 序号域(data), 密码域(key),指向下一个人的指针域(next).
2:程序开始时由用户任意输入人数n及一个正整数作为报数上限值m,一个正整数作为密码最大值,判断所输密码是否在范围内。然后为依次每一个人指定一个密码
3:初始密码为用户外部输入的密码m, 从第一个人开始按顺市针方向自1开始报数.,报道m的时停止,报m的人出列,将他的密码作为新的密码值(m), 从他在顺针方向的下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止.
4:本程序最终结果为n 的人的出列顺序
5:测试数据: m的初值为1; n =5(即有5个人)57个人的密码依次为:1,2,3,4,5.首先没的值为1,正确的出列顺序应为1,2,4,3,5。
6:程序执行的过程为:
???????(1)创建单向循环链表
?? (2)开始报数
?? (3)输出出列的顺序号
四.详细设计
? ?1.本程序包含三个模块
???? 1) 主程序模块
?int main()
?{
???? int m,n,i=0;
? LinkList s;
? printf(请输入报数上限m和人数n:\n);?
? do{
?? if(i0)
??? printf(输入有误,请重新输入:\n);
? scanf(%d,m);
?
? getchar();
? scanf(%d,n);
? getchar();
? i++;
? }while(m = 0 || n = 0);
? s=CreatList_L(n);
? ListDelete_L(s,m,n);
? return 0;
?}
????? 2) 构造链表并输入每个人信息模块;
LinkList L,r,q;
?int i,key;
?printf(请输入%d个数字作为每个人的密码:\n,n);
?for(i=1;i=n;i++)
?{
? scanf(%d,key);? //输入每个人的密码
? r=(LinkList)malloc(sizeof(LNode));
? if(i==1)
? {
?? L=q=r;
? }
? else{
???? q-next=r;
???? q=r;
? }????
??????? r-num=i;?
??????? r-pwd=key;
?}
?r-next=L; //使最后节点指向首节点,形成循环链表
?return L; //向主函数返回创建完成的循环链表首节点的地址
}
3)主要处理出列的函数:
void ListDelete_L(LinkList L, int m, int n){
?LinkList p,s;
?int j;
?while(n0){//只要人数大于0就继续,直到全部出列
? p=L;
? for(j=1; jm; j++){? //顺序找到第m个节点(人)并使指针指向该节点
?? s=p;
?? p=p-next;
? }
? printf(出列人原来的序号是:%d\n,p-num); //输出出列人序号
? m=p-pwd; //将出列人的密码作为新的报数值m
? s-next=p-next;//将出列的节点(人)从循环链表中删除
? L=p-next;
? free(p);
? n--;
?}
}
2.设计程序如下:
#includestdio.h
#includemalloc.h
typedef struct LNode{
?int pwd,num;
?struct LNode *next;
}LNode, *LinkList;
LinkList CreatList_L(int n){
?//建立循环链表
?LinkList L,r,q;
?int i,key;
?printf(请输入%d个数字作为每个人的密码:\n,n);
?for(i=1;i=n;i++)
?{
? scanf(%d,key);? //输入每个人的密码
? r=(LinkList)malloc(
您可能关注的文档
- 门禁系统的发展现状与趋势(已发中安防).doc
- 人教版五年级数学下册期中考试试卷分析.doc
- 无线传感器网络论文中英文资料对照外文翻译.doc
- (2017年春季版)《盛唐气象》教学设计.docx
- 2017新版语文《咕咚》幻灯片课件.ppt
- 梁板结构设计课件.ppt
- 江阴市探索多元养老模式的实践与思考.docx
- 微信公众号信息服务平台研究中英文外文文献翻译2017.doc
- 中药调剂——中药饮片调剂标准操作规程.docx
- 公司文件管理规定.docx
- DB44_T 2611-2025 城市排水管网有毒有害气体监测与风险分级管理技术标准.pdf
- DB44_T 2612-2025 竞赛类科普活动策划与实施服务规范.pdf
- DB43_T 2947-2024 烟草种子质量控制规程.pdf
- DB37_T 4836-2025 煤矿风量实时监测技术要求.pdf
- 叉车防撞系统,全球前22强生产商排名及市场份额(by QYResearch).docx
- 超滤膜,全球前18强生产商排名及市场份额(by QYResearch).docx
- DB62T 4172-2020 玉米品种 酒623规范.pdf
- DB62T 4160-2020 在用真空绝热深冷压力容器综合性能在线检测方法.pdf
- DB62T 4164-2020 辣椒品种 酒椒1号.pdf
- DB62T 4133-2020 公路隧道地质超前预报机械能无损探测技术规程.pdf
文档评论(0)