日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Josephus问题

發布時間:2023/11/27 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。