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 }










《C语言实现约瑟夫环讨论》

 

 

 

    原文作者:FiReKing
    原文地址: https://www.cnblogs.com/FireKing/p/3405806.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞