Josephus问题
生活随笔
收集整理的這篇文章主要介紹了
Josephus问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目的:練習下單鏈表和指針 (OS 10.7 + Xcode 4.2)
代碼如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct lnode 5 { 6 int data; 7 struct lnode *next; 8 }lnode; 9 10 int main(void) 11 { 12 int n,fire_num; 13 14 //輸入相關參數并檢測合法性 15 printf("請輸入參與人數: "); 16 scanf("%d", &n); 17 int mark = 1; 18 while (mark) 19 { 20 if (n < 1) 21 { 22 printf("代碼……解析……錯誤……殺人程序不予啟動!請重新輸入參與人數:"); 23 scanf("%d", &n); 24 continue; 25 } 26 else mark = 0; 27 } 28 printf("請輸入殺手代碼: "); 29 scanf("%d", &fire_num); 30 mark = 1; 31 while (mark) 32 { 33 if (fire_num < 1) 34 { 35 printf("代碼……解析……錯誤……殺人程序不予啟動!請重新輸入殺手代碼:"); 36 scanf("%d", &fire_num); 37 continue; 38 } 39 else mark = 0; 40 } 41 42 //建立一個無頭、尾節點的循環鏈表 43 struct lnode *p = malloc(sizeof(lnode)); 44 p->data = 1; 45 struct lnode *q = p; 46 for (int i = 2; i <= n; ++i) 47 { 48 struct lnode *tmp = malloc(sizeof(lnode)); 49 tmp->data = i; 50 tmp->next = NULL; 51 q->next = tmp; 52 q = tmp; 53 } 54 q->next = p; 55 56 //鏈表建立完畢,p始終指向q的前驅節點,r用于釋放節點空間 57 int i = 1; 58 while (p->next != q) 59 { 60 while ( i != fire_num) 61 { 62 q = p; 63 p = p->next; 64 ++i; 65 } 66 struct lnode *r; 67 q->next = p->next; 68 r = p; 69 p = p->next; 70 free(r); 71 if (i == fire_num) 72 { 73 i = 1; 74 } 75 } 76 77 //最后剩下兩個節點,獨立判斷生還者。其中計數循環始終從p指向節點開始 78 if (fire_num % 2 ==0) 79 { 80 printf("還剩下一位生還者,其編號為%d。如需繼續處理,請啟動終結者模式!\n", p->data); 81 } 82 else 83 printf("還剩下一位生還者,其編號為%d。如需繼續處理,請啟動終結者模式!\n", q->data); 84 85 return 0; 86 }
還剩兩個節點時,沒想到什么好辦法,單獨拿出來計算吧~~~
轉載于:https://www.cnblogs.com/youngsing/archive/2012/11/01/2750277.html
總結
以上是生活随笔為你收集整理的Josephus问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个暖男气质的qq网名!
- 下一篇: 求一个qq网名闺蜜2人霸气十足!