资源描述:
《数据结构实验报告约瑟夫环》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划数据结构实验报告约瑟夫环 一、上机实验的问题和要求: 约瑟夫环 问题描述:编号是1,2,?,n(n>0)的n个人按照顺时针方向围坐一圈,每人持有一正整数密码。开始时任选一个正整数作为报数上限值m,从某个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。令n最大值取30。设计一个程序来求出出列顺序,并输出
2、结果。 基本要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各人的编号。 二、程序设计的基本思想,原理和算法描述: 算法的基本思想: 约瑟夫环问题中的数据是人所在的位置,而这种数据是存在“第一元素、最后元素”,并且存在“唯一的前驱和后继的”,符合线性表的特点。由于需要模拟约瑟夫环的出列问题,可以采用顺序表来实现线性表,完成出列顺序的输出。 核心算法主要分为两步: 1、确定需要删除的位置, 2、设置并删除该位置。目的-通过该培训员工可对保安行业有初步了解,并感受到安保行业的发展的巨大潜力,可提升其的专业水平,并确
3、保其在这个行业的安全感。为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划 已知报数间隔m,我们可以把当前位置加上m获得需要删除的位置,如果获得的位置超过顺序表中实际元素的总长度,则可以通过减去数组的实际长度来修正。然后把顺序表中的当前指向位置设置为该位置,继而删掉该位置。 反复进行上述确定位置和删除位置的操作,直到顺序表为空。 主程序的流程: 程序由三个模块组成: 1、输入模块:无提示语句,直接输入总人数n和报数次数m,中间用逗号隔开。 2、处理模块:将元素储存
4、于顺序表中。在主函数中根据报数间隔确定需要删除的元素的位置,在顺序表中设置该位置并删除该位置,同时输出该位置的值。反复设置并删除直到表空。 3、输出模块:分别在DOS下和文件中,按移除元素的顺序依次显示其位置。 各程序模块之间的层次关系: 主函数会按设计的方法调用顺序表中“获取实际长度”、“设置需要删除元素的位置”、“移除该位置元素”和“判断是否为空表”四种方法方法,使元素依次出列,并正确结束程序。 三、源程序及注释:目的-通过该培训员工可对保安行业有初步了解,并感受到安保行业的发展的巨大潜力,可提升其的专业水平,并确保其在这个
5、行业的安全感。为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划 #include #include #include /*宏定义和单链表类型定义*/ #defineListSize100 typedefintDataType; typedefstructNode { DataTypedata; structNode*next; }ListNode,*LinkList; /*函数声明*/ LinkListCreateCycList(intn);/*创
6、建一个长度为n的循环单链表的函数声明*/ voidJosephus(LinkListhead,intn,intm,intk);/*在长度为n的循环单链表中,报数为编号为m的出列*/ voidDisplayCycList(LinkListhead);/*输出循环单链表*/ voidmain() { LinkListh; intn,k,m;目的-通过该培训员工可对保安行业有初步了解,并感受到安保行业的发展的巨大潜力,可提升其的专业水平,并确保其在这个行业的安全感。为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特
7、制定安保从业人员的业务技能及个人素质的培训计划 printf("输入环中人的个数n="); scanf("%d",&n); printf("输入开始报数的序号m="); scanf("%d",&k); printf("输出结果为:"); scanf("%d",&k); h=CreateCycList(n); Josephus(h,n,m,k); } voidJosephus(LinkListhead,intn,intm,intk) /*在长度为n的循环单链表中,从第k个人开始报数,数到m的人出列*/{ ListN
8、ode*p,*q; inti; p=head; for(i=1;inext; } while(p->next!=p) {for(i=1;inext; } q->next=p->next;/*