C語言單鏈表實現約瑟夫環

2021-09-06 01:43:52 字數 1738 閱讀 1962

前兩天朋友給我發來乙個題目,問我能不能用c語言鍊錶實現。

13個人圍成一圈,從第1個人開始順序報號1,2,3。凡報到「3」者退出圈子,找出最後留在圈子中的人原來的序號。要求用鍊錶實現。

看了題目以後發現其實是約瑟夫環,是乙個數學應用問題。

約瑟夫環又稱為約瑟夫問題丟手絹問題

一群人圍在一起坐成環狀,從某個編號開始報數,數到某個數的時候,此人出列,下乙個人重新報數,一直迴圈,直到所有人出列,約瑟夫環結束。

例如有序號分別為 1、2、3 的人圍成乙個圈, 從 1 開始報數,數到 3 的淘汰。

第一輪,淘汰:3,剩餘 1、2、

第二輪,淘汰:1,剩餘 2

2 號就是最後留在圈子中的人。

**中用了鏈式佇列的思想來模擬報數,頭部取出,尾部插入。

#include #include /**

* 結構體

*/struct pernode ;

/***函式功能:採用malloc函式動態地建立並初始化乙個單向鍊錶

**入口引數:ilstlen為擬建立鍊錶的結點數

**返回值:新建立鍊錶的頭結點的指標

*/struct pernode * crtprlst(int ilstlen)

return headnode;

}/**

* 刪除並返回鍊錶的第乙個元素

* @param ptmp

* @return

*/struct pernode * pop(struct pernode * ptmp)

// 取出第乙個元素

struct pernode * temp = ptmp->m_pnextper;

if (temp == null)

// 移除第乙個元素

ptmp->m_pnextper = temp->m_pnextper;

return temp;

}/**

* 向鍊錶的末尾新增乙個元素

* @param ptmp

* @param value

*/void push(struct pernode * ptmp, int value)

// 新建乙個元素

struct pernode * node = malloc(sizeof(struct pernode));

node->m_inumber = value;

node->m_pnextper = null;

// 如果最後乙個元素不為空則插入到它的後面

if (l != null)

}struct pernode * josephus(struct pernode *ptmp)

// 如果這個人報數不是 3,則放回鍊錶尾部

if (i % 3 != 0)

// 記錄當前的元素

p = node;

}return p;

}/**

* 列印鍊錶

* @param l

*/void printlink(struct pernode * l)

printf("---------\n");

}int main()

2018 年最後一篇文章。

C語言單鏈表實現約瑟夫環

1.約瑟夫環問題 編號為1,2 n的人按順時針方向圍坐一圈,每個人持有乙個密碼 正整數 開始任選乙個整數作為報數上限m,從第乙個人順時針自1開始順時針報數,報到m時停止報數。報到m的人出列,將他的密碼作為新的m值,從他順時針方向上的下乙個人開始重新從1報下去,如此下去,直到所有的人全部出列為止。例如...

單鏈表實現約瑟夫環

語塞夫環問題 問題來歷 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再...

單鏈表實現約瑟夫環

約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍。從第乙個人開始報數,數到k的那個人出列 他的下乙個人又從1開始報數,數到k的那個人又出列 依此規律重複下去,直到圓桌只剩下乙個人。那麼如何用單鏈表來實現約瑟夫環呢,首先我們需要構建乙個帶環鍊錶,定義乙個指標c...