C语言实现约瑟夫环讨论
【问题描述】 约瑟夫(Joseph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
以下是个人的代码实现功能:
1 #include<stdio.h> 2 #include<malloc.h> 3 4 typedef struct node 5 { 6 int num; //结点的编号 7 int cipher; //密码 8 struct node *next; 9 }linklist; 10 11 linklist *creatList(int n) 12 { 13 14 linklist *p,*q,*head; 15 int i=1; 16 head=p=(linklist *)malloc(sizeof(linklist)); 17 p->num=i; 18 printf("请输入第1个人的密码:"); 19 scanf("%d",&p->cipher); 20 for(i=2;i<=n;i++) 21 { 22 q=(linklist *)malloc(sizeof(linklist)); 23 if(q==0) return(0); 24 printf("请输入第%d个人的密码:",i); 25 scanf("%d",&q->cipher); 26 q->num=i; 27 p->next=q; 28 p=q; 29 } 30 p->next=head; /*使链表尾指向链表头形成循环链表*/ 31 return head; 32 } 33 void fun(linklist *L) 34 { 35 int m,i; 36 linklist *p=L,*q,*s; 37 printf("请输入m的初值:"); 38 scanf("%d",&m); 39 printf("出列顺序为:"); 40 while(p->next!=p) 41 { 42 for(i=1;i<m;i++) 43 { 44 q=p; 45 p=p->next; 46 } 47 printf("%5d",p->num); 48 m=p->cipher; 49 s=p; 50 q->next=p->next; 51 p=p->next; 52 free(s); 53 } 54 printf("%5d",p->num); 55 printf("\n"); 56 } 57 main() 58 { 59 linklist *L; 60 int n; 61 printf("请输入实验人数:"); 62 scanf("%d",&n); 63 L=creatList(n); 64 fun(L); 65 }