題目:
編號為1,2,…,n的n個人按順時針方向圍坐一圈,每個人持有乙個密碼(正整數)。一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m 值,從他在順時針方向上的下乙個人開始重新從1報數,如此下去,直到所有人全部出列為止。學完鍊錶後面的題目,最後一題就是要求用鍊錶實現約瑟夫環帶密碼的問題。
很明顯建立乙個迴圈鍊錶可以實現我們想要的結果。
單迴圈鍊錶的建立與單鏈表的建立一樣,只是將尾結點的指標域指向頭指標所在的位址。
宣告乙個人的結構體,每個人有自己的編號和所攜帶的密碼,所以:
struct node
;
建立單迴圈鍊錶:
void
createlist
(node *
*head,
int n)
//資料錄入與單迴圈鍊錶的建立
p2->next =
*head;
//尾結點指向頭結點
}
錄入資料後,建立好了乙個單迴圈鍊錶。
接下來是主函式:
int
main()
free
(pf)
;//釋放被踢出的那個人所在的位置
m = p1->m;
//密碼值的更換
printf
("%d "
,p1->position)
;//輸出被提出的那個人的位置
p2->next = p1->next;
//重新連線鍊錶
n--;}
puts(""
);system
("pause");
return0;
}
實現的過程:
通過for迴圈,使得鍊錶指標指到將要被踢出人所在的位置,踢出可以理解為釋放掉那個人在的位置,並且把被釋放的結點左右結點接合起來,再次形成鏈式結構。
測試情況:
迴圈鍊錶解決帶密碼的約瑟夫環問題
這裡用迴圈鍊錶實現乙個帶密碼的約瑟夫環 意思是有n個人,編號1 n,他們每個人手裡拿著屬於自己的密碼。大家按照編號坐成一圈,然後給定乙個數m,然後大家從頭進行0 m報數,報到m的人出列,交出密碼,剩餘的人從這裡開始繼續報數,規則一樣.直到全部出列,問你最後的密碼是什麼?easy 有頭結點迴圈鍊錶實現...
約瑟夫環的實現
用迴圈鍊錶實現的,思路很簡單,只是要注意指標的修改,程式設計基礎差的容易出錯。約瑟夫環 迴圈鍊錶實現 author milo.wang date 2012 9 15 include using namespace std typedef struct node node,nodeptr void j...
約瑟夫環的O n 演算法
問題描述 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列,求最後乙個出列人的編號。為了討論方便,先把問題稍微改變一下,並不影響原意 問題描述 n個人...