用C鍊錶實現約瑟夫環問題

2022-09-13 12:57:09 字數 1816 閱讀 3459

問題:設有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,表示...