1 #include <stdio.h>
2 #include <stdlib.h>
3 //約瑟夫環(huán)的實(shí)現(xiàn):一群人圍成一圈,這群人共有 n個(gè)人,每個(gè)人身上都一個(gè)key,依次給這圈人編號(hào):
4 //1,2,
n 一開(kāi)始報(bào)數(shù)的上限值為m從第一個(gè)人(編號(hào):1)自一開(kāi)始報(bào)數(shù)報(bào)到m時(shí)停止報(bào)數(shù),報(bào)到m的人出列,
5 //將他的密碼做為新的m值,從他的順時(shí)針?lè)较蜷_(kāi)始的下個(gè)人開(kāi)始從新從一報(bào)數(shù),如此下去,直至所有的人出列為止
6 typedef struct Node
7 {
8 int key;//每個(gè)人身上帶的key
9 int NUM;//每個(gè)人的編號(hào)
10 struct Node *next;
11 }Node;
12 //=========================
13 int n;//總共的人數(shù)
14 Node *L=NULL;//循環(huán)鏈表指針
15 //=========================
16 void InitList(int x)//初始化第一個(gè)節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)有實(shí)際的意義
17 {
18
19 L = (Node*)malloc(sizeof(Node));
20 if(!L)
21 {
22 printf("malloc fail\n");
23 system("PAUSE");
24 exit(1);
25 }
26 L->NUM=1;
27 L->key=x;
28 L->next=L;
29 }
30 //===========================================
31 void DelNode(Node *p_front)//p_front指向的是p的前一個(gè)節(jié)點(diǎn),刪除的卻是p
32
33 {
34 Node *tmp=p_front->next;
35 p_front->next = tmp->next;
36 free(tmp);
37 }
38 //============================================
39 void CreateList(void)//創(chuàng)建循環(huán)鏈表
40 {
41 printf("Players n=");
42 scanf("%d",&n);
43 while(n<1||n>30)
44 {
45 printf("n must >=1 && <=30\n");
46 printf("Players n=");
47 scanf("%d",&n);
48 }
49 int key_tmp;
50 printf("NUM=1 key=");
51 scanf("%d",&key_tmp);
52 while(key_tmp<1||key_tmp>300)
53 {
54 printf("key must >0&&<=300\n");
55 printf("NUM=1 key=");
56 scanf("%d",&key_tmp);
57 }
58 InitList(key_tmp);
59 int i;
60 Node *s,*p=L;
61 for( i=2;i<=n;i++)
62 {
63 s=(Node*)malloc(sizeof(Node));
64 if(!s)
65 {
66 printf("malloc error\n");
67 system("PAUSE");
68 exit(1);
69 }
70 printf("NUM=%d key=",i);
71 scanf("%d",&key_tmp);
72 while(key_tmp<1||key_tmp>300)
73 {
74 printf("key must >0 && <=300");
75 printf("\nNUM=%d key=",i);
76 scanf("%d",&key_tmp);
77 }
78 s->key=key_tmp;
79 s->next=L;//構(gòu)成循環(huán)鏈表的next指針賦值
80 p->next=s;
81 s->NUM=i;
82 p=s;//指針p往前移動(dòng)
83 }
84 }
85 //=============================================
86 void PlayGame(void)//開(kāi)始游戲!報(bào)數(shù)
87 {
88 Node *p=L;
89 Node *p_front=L;
90 int m;
91 printf("start game !\n");
92 printf("m=");
93 scanf("%d",&m);
94 while(m<1||m>300)
95 {
96 printf("m must >0 && <=300\n m=");
97 scanf("%d",&m);
98 }
99 int i;
100 int count = n;
101 for(i=1;i<=m;i++)
102 {
103 // printf("num =%d key=%d\n",p->NUM,p->key);
104
105 if(m==i)
106 {
107
108 m=p->key;
109 i=0;
110 printf(" %d",p->NUM);
111 DelNode(p_front);
112 p=p_front;
113 count--;
114 if(count==1)
115 {
116 printf(" %d",p->NUM);
117 //printf("num =%d key=%d\n",p->NUM,p->key);
118 printf(" all out !\n");
119 system("PAUSE");
120 exit(0);
121 }
122
123 }
124 p_front=p;
125 p=p->next;
126
127 }
128 }
129 //==================================================
130 int main(int argc, char *argv[])//運(yùn)行游戲!
131 {
132 CreateList();
133 PlayGame();
134 system("PAUSE");
135 return 0;
136 }
137