资源描述:
《约瑟夫环实验报告(3种方法实现)》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、约瑟夫环的三种实现方法的实验报告公选题:约瑟夫环(使用一维数组、一维结构体数组、循环链表三种方法完成)一,实验目的1、学会通过对问题的分析,设计一种合理的数据结构,并进行定义及操作的实现。2、掌握利用一维数组,结构体,还有循环链表的各种操作來进行具体的实际应用。3、加强程序设计的能力。二,实验内容什么是约瑟夫环?约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.」分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。举例如下;n=9,k=1,m=
2、5【解答】出局人的顺序为5,1,7,4,3,6,9,2,8。三,怎么用程序来实现这个实际场景?要实现这个场景有多种语言(C,C++,JAVA语言,C#),每--种语言在实现的过程中各有不同,在实现上复杂程度也不同。针对自己目前的水平以及查阅相关资料,做了如下的一些解决方案。四,三种解决方法()1,使用一维数组:#include#defineN10〃总人数#defineM5//间隔数voidmain(){inta[Nl;intcount=0;inti=0;while(i<10)intx;printfC请输入第%<1个元素的值:”,i+l);scan
3、f(”%d",&x);a[i]=x;i++;}printf("所有元素信息如下:”);for(intj=O;jN-l)i=0;}printf(H%dM,i?a[i-l]:a[N-lJ);a[(i?(i・l):(N・l))]=O;〃哪一个出列了哪一个值就标记为0}printf(Hn);}1,使用一维结构体数组:#include
4、#defineN100structshuzuintnum;};structshuzua[N];voidInput(intn){intx;for(inti=0;in-Dj=0;}printf("%dl].num:a[
5、n-1].num);a[G?(j-l):(n-l))].num=O;//哪一个出列了哪一个值就标记为0voidmain()intn;〃请输入总个数intm;//间隔数printfC*请输入总个数n:H);scanf(”%d”,&n);Input(n);printff请输入间隔数m:”);scanf(H%d",&m);yuesefu(n,m);}1,使用循环链表:#include#includetypedefstructnode{intnum;structnode*next;}NODE;〃创建一个没有头结点的链表NODE*creat
6、elinklist(intn){system("color5");NODE*head,*p,*q;inti=l;intx;head=p=(structnode*)malloc(sizeof(structnode));printf(n请输入第1个元素的值「);scanf(H%d",&x);p->num=x;//没有头结点的链表for(i=2;i<=n;i++){inty;q=(structnode:}:)inalloc(sizeof(structnode));if(q==O)return(O);p->next=q;p=q;printf(n请输入第%(1个元素的值:n,i
7、);scanf(”%d”,&y);p->num=y;}p->next=head;//使链表尾指向链表头形成循环链表returnhead;}〃输出这个链表voidprintlinklist(NODE*p,intn){system("color1f1);inti;NODE*q=p;if(NULL==q->next){printf(“链表为空!”);return;}printf(”所有元素的信息列表:”);for(i=l;i<=n;i++)if(NULL=q)printf(HthelistisNULL!11);return;}printf("%dn,p