迴圈鍊錶 約瑟夫環問題

2021-07-04 20:01:50 字數 1210 閱讀 8308

正好這幾天在看資料結構,覺得鍊錶應用挺廣的,特寫一例項。

問題描述:

選首領。n個遊戲者圍成一圈,從第乙個開始順序報數1,2,3.凡報到3者退出圈子,最後留在圈中的人為首領。

思路:建立乙個包含n個節點的單迴圈鍊錶來模擬n個人圍成的圈。節點的資料域存放遊戲者的編號。

在程式中,以刪除節點模擬人退出圈子的處理,整型變數c(初始值為1)用於計數,指標變數p的初始值為head,執行時,從p所指的節點開始計數,p沿煉表中的指標每次向後指乙個節點,c值隨p指標的移動相應地遞增。當c計數到2時,就刪除下乙個節點,然後將c置為0。為了避免將剩下的最後乙個節點刪除,另外設定乙個計數器k,其初值為參加遊戲的人數。每當刪除乙個節點時,k值就減1,當k等於1時,首領就選出來了!

**:[cpp]view plain

copy

#include 

#include 

typedef

struct

nodenode,*linklist;  

linklist  create_list(int

n)  

/* 建立乙個節點數為n的單迴圈鍊錶,返回值為遊戲編號為1的節點的指標  */

head->code=1;  head->next=head;  

for(i=n;i>1;--i)  

p->code=i;  p->next=head->next; head->next=p;  

}/*for*/

return

head;  

}/*create_list*/

void

output(linklist head)

/*輸出鍊錶中的節點的資料*/

while

(p!=head);  

printf("/n"

);  

}/*output*/

void

play(linklist head,

intn)  

/*if*/

else

}/*while*/

printf("/n%4d 是首領."

,p->code);  

/*輸出最後留在圈子內的人的編號*/

}/*play*/

void

main(

void

)    

}  

截圖:**:

約瑟夫環問題(迴圈鍊錶)

這是一道比較經典的迴圈鍊錶問題,在華為上機筆試中也出現過。約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。includ...

約瑟夫環問題(迴圈鍊錶)

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

迴圈鍊錶 約瑟夫環問題

假設n個人決定選出乙個領導,將所有人排成乙個圓圈,沿著這個圓圈每次數到m個人就排除對應著者,每當有人出列後,其餘人靠攏,任然保持乙個完整的圓圈,問題就是找出剩下的那個人是誰,這就是所謂的約瑟夫問題。演算法思想 為了以一種迴圈方式排列人群,我們構建乙個迴圈鍊錶,每個人與迴圈左邊的人之間構成乙個鏈結,整...