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

2021-07-11 09:23:49 字數 1388 閱讀 7436

1.約瑟夫環問題

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

例如,m的初值為20;n=7,7個人的密碼依次是3,1,7,2,4,8,4。求出列的順序。

2.問題分析

1.要實現報數,必須有乙個數來計數,判斷是否到m。

2.出列,用單鏈表實現即將此節點從單鏈表中刪除。所以,必須有兩個指標,乙個指向當前節點,乙個指向當前節點的上乙個節點。刪除操作主要用這兩個節點來完成。

模擬圖如下,第乙個數字為序號,第二個數字為密碼

3.c語言實現

c語言實現,採用不帶頭結點的迴圈單鏈表實現,因此我們需要乙個頭指標來指明鍊錶的開始,又因為要迴圈,所以需要乙個尾指標來指明鍊錶的尾。

1.以下為初始化迴圈單鏈表的過程。此處注意返回值為結構體型別的指標,返回鍊錶的頭指標h

typedef struct node 

josephring,*js;

js init_ring()

else

rear = temp; //表尾指標指向新的節點;

} rear->next = h ;

return h;

}

2.接下來實現出列過程

void circle()			

} printf("序號為%d的人出列\n",p->serial);

free(p);

}

js p = init_ring();意思是p指標指向頭結點。

此處舉例一次出列的過程:

m=20;

執行到i++時,p,q指標情況如下:

再執行

q ->next = p->next;

free(p);

p = q ->next;

free§在鍊錶中表示就是2(用紅色標出)那條線斷開,當然在計算機中是記憶體釋放。

然後繼續迴圈。

執行結果截圖給出:

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

前兩天朋友給我發來乙個題目,問我能不能用c語言鍊錶實現。13個人圍成一圈,從第1個人開始順序報號1,2,3。凡報到 3 者退出圈子,找出最後留在圈子中的人原來的序號。要求用鍊錶實現。看了題目以後發現其實是約瑟夫環,是乙個數學應用問題。約瑟夫環又稱為約瑟夫問題 丟手絹問題。一群人圍在一起坐成環狀,從某...

單鏈表實現約瑟夫環

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

單鏈表實現約瑟夫環

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