约瑟夫环问题

  约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
  

  这里给出的例子中,是从编号为1的人开始报数,数到5的人出列。

 

 1 /*约瑟夫环问题*/
 2 
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 
 6 typedef struct Node
 7 {    
 8     int    num;
 9     struct Node *next;
10 }LinkList;
11 
12 //创建长度为 n 的链表
13 LinkList *creat(int n)
14 {
15     LinkList *p,*q,*head;
16     int i=1;  
17     p=(LinkList *)malloc(sizeof(LinkList));
18     p->num=i;
19     head=p;
20     for(i=2;i<=n;i++)
21     {
22         q=(LinkList *)malloc(sizeof(LinkList));
23         q->num=i;
24         p->next=q;
25         p=q;        /*p指向当前节点*/
26     }
27     p->next=head;    /*使链表尾指向链表头,形成循环链表,相当于约瑟夫环*/
28    return head;
29 }
30 
31 void fun(LinkList *L,int m)
32 {
33     LinkList *p,*s,*q;
34     p=L;
35     printf("出列顺序为:");
36     while(p->next != p)
37     {
38         for(int i=1;i<m;i++)
39         {    q=p;
40             p=p->next;
41         }
42         printf("%4d",p->num);
43         s=p;            /*暂存节点,便于释放*/
44         q->next=p->next;
45         p=p->next;  
46         free(s);        /*节点值输出后释放资源*/
47     }
48     printf("%4d
",p->num);  /*输出最后一个节点中数值*/
49 }
50 
51 int main()
52 {
53     LinkList *L;
54     int n, m;
55     n=9;
56     m=5;
57     L=creat(n);
58     fun(L,m);    
59     return 0;
60 }
原文地址:https://www.cnblogs.com/followyourdream/p/3372464.html