约瑟夫环问题
约瑟夫环是一个数学的应用问题:已知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\n",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 }