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

2021-08-30 06:34:37 字數 1476 閱讀 2146

問題:設有n個人圍成乙個圓圈,現從第s個人開始報數,數到第m的人出列,然後從出列的下乙個人重新開始報數,數到第m的人再次出列,如此反覆,直到所有的人全部出列為止。對於任意給定的n、s、m,求按出列次序得到的n個人員的序列。

例:

就是問題簡單示例,裡面是每次要迴圈的資料,後面的s是出列的人

思路:

先建立乙個鍊錶,鍊錶的長度就是n

從第s個節點開始迴圈

判斷是否是第m個數

如果是第m個數,就輸出並刪除當前節點

迴圈到最後乙個節點,再從第乙個節點接著迴圈

主要**:

void yuesefu (linklist * head, int n, int s, int m)

l++;

q = q->next;

}//從下乙個節點開始迴圈

p = getdata_linklist(head, l);

j--;

}else

//如果超出鍊錶長度,再從第乙個節點開始迴圈

if (p == null)

p = head->next;

i++; }

}

整體**:

#include #include typedef int elemtype;

typedef struct node

linklist;

//建立鍊錶

linklist * create_linklistf(int n)

return head;

}//按序號查詢

linklist * getdata_linklist (linklist * head, int i)

if (i == j)

return p;

else

return null;

}//刪除節點

int deletenode_linklist (linklist * head, int i)

else }

void yuesefu (linklist * head, int n, int s, int m)

l++;

q = q->next;

}//從下乙個節點開始迴圈

p = getdata_linklist(head, l);

j--;

}else

//如果超出鍊錶長度,再從第乙個節點開始迴圈

if (p == null)

p = head->next;

i++; }

}int main (void)

用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,表示...