單鏈表實現約瑟夫環問題

2021-08-27 17:56:04 字數 1059 閱讀 9583

首先我們來了解一下什麼是約瑟夫環:

約瑟夫環(約瑟夫環問題)是乙個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍只剩下乙個人。

今天用單鏈表實現約瑟夫環:

了解完什麼是約瑟夫環問題後,我們知道這是乙個同心圓,而單鏈表並不是乙個迴圈鍊錶,要想實現鍊錶的迴圈以構成同心圓,我們首先要做的就是讓單鏈表構成乙個迴圈鍊錶,即讓單鏈表的尾節點的pnext指向頭節點;其次在已知數到m的人(從1開始報數)出列的情況下,我們要做的就是先找到這個人,即找到要刪除的節點,因為數到m的人要出列,所以我們只需要走m-1步便可以找到要刪除的節點。在找到要刪除的節點之後,為了讓刪除節點的下乙個節點作為下一次開始報數的第乙個節點,在找刪除節點的過程中,我們必須儲存每個節點的前乙個節點。一直迴圈下去,直到迴圈鍊錶中只剩下乙個節點。

**實現如下:

#include #include #include typedef int datatype;

typedef struct slistnode

slistnode;

//初始化

void slistinit(slistnode **ppfirst)

//列印函式

void slistnodeprint(slistnode **ppfirst)

printf(" null\n");

}//約瑟夫環

slistnode * jocephcircle(slistnode *pfirst, int k)

pcur->pnext = pfirst;

pcur = pfirst;

while (pcur->pnext != pcur) //只剩下乙個節點時返回

//刪ppre->pnext = pcur->pnext;

free(pcur);

pcur = ppre->pnext; //從刪除節點的下乙個節點開始繼續迴圈

} return pcur;

}

單鏈表實現約瑟夫環

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

單鏈表實現約瑟夫環

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

單鏈表實現約瑟夫環

約瑟夫環 以五個節點的帶環單鏈表 最後乙個節點指向第乙個節點 為例子 1 從煉表頭開始,先刪除第二個節點 2 從刪除節點的下乙個節點開始,再往後找第二個節點,然後刪除。3 一直重複過程2,直到剩下乙個節點,返回該節點。listnode joecircle listnode phead,int m i...