問題:設有n個人圍成乙個圓圈,現從第s個人開始報數,數到第m的人出列,然後從出列的下乙個人重新開始報數,數到第m的人再次出列,如此反覆,直到所有的人全部出列為止。對於任意給定的n、s、m,求按出列次序得到的n個人員的序列。
就是問題簡單示例,裡面是每次要迴圈的資料,後面的s是出列的人
思路:
先建立乙個鍊錶,鍊錶的長度就是n
從第s個節點開始迴圈
判斷是否是第m個數
如果是第m個數,就輸出並刪除當前節點
迴圈到最後乙個節點,再從第乙個節點接著迴圈
主要**:
void yuesefu (linklist * head, int n, int s, intm)2
27 l++;
28 q = q->next;29}
30//
從下乙個節點開始迴圈
31 p =getdata_linklist(head, l);
32 j--;
33 }else
36//
如果超出鍊錶長度,再從第乙個節點開始迴圈
37if (p ==null)
38 p = head->next;
3940 i++;41}
4243 }
整體**:
4 typedef int
elemtype;
56 typedef struct
node
7linklist;
1112
//建立鍊錶
13 linklist * create_linklistf(int
n)14
3435
return
head;36}
3738
//按序號查詢
39 linklist * getdata_linklist (linklist * head, int
i)40
5354
if (i ==j)
55return
p;56
else
57return
null;58}
5960
//刪除節點
61int deletenode_linklist (linklist * head, int
i)62
else
8485}86
87void yuesefu (linklist * head, int n, int s, int
m)88
113 l++;
114 q = q->next;
115}
116//
從下乙個節點開始迴圈
117 p =getdata_linklist(head, l);
118 j--;
119 }else
122//
如果超出鍊錶長度,再從第乙個節點開始迴圈
123if (p ==null)
124 p = head->next;
125126 i++;
127}
128129
}130
131int main (void
)132
用C鍊錶實現約瑟夫環問題
問題 設有n個人圍成乙個圓圈,現從第s個人開始報數,數到第m的人出列,然後從出列的下乙個人重新開始報數,數到第m的人再次出列,如此反覆,直到所有的人全部出列為止。對於任意給定的n s m,求按出列次序得到的n個人員的序列。例 就是問題簡單示例,裡面是每次要迴圈的資料,後面的s是出列的人 思路 先建立...
鍊錶實現約瑟夫環問題
約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從1開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌剩下最後乙個人,求那個人的位置。總體思路 1 建立鍊錶 用尾插法建立 2 當人數大於...
Problem E 用鍊錶實現約瑟夫環
你聽說過約瑟夫問題嗎?問題大致如下 首先n個人圍成乙個圈,標記為1到n號。接著,從1號開始報數 從1開始 然後2號報數,然後3號。當有人報到到m時,這個人就要踢出比賽,然後從被踢出的人的下乙個人開始,重新報數 從1開始 這樣經過n 1次後,就只剩下了乙個人,問最後剩下的那個人是幾號?第1行為t,表示...