最近開始複習資料結構,今天手寫了乙個約瑟夫迴圈問題。
首尾相連的鍊錶:head->last=tail;tail->next=head
建立迴圈鍊錶和建立普通鍊錶方法差不多,只需要首尾相連即可
已知 n 個人(以編號1,2,3,…,n分別表示)圍坐在一張圓桌周圍,從編號為 k 的人開始順時針報數,數到 m 的那個人出列;他的下乙個人又從 1 還是順時針開始報數,數到 m 的那個人又出列;依次重複下去,要求找到最後出列的那個人。
例如:5個人,編號依次為12345,從第3個人開始報數,報到2的退出,然後下乙個接著從開始報數
那麼退出的順序是:4-1-3-2-5
思路:從第k個節點開始,將第m-1個節點釋放,連線好鍊錶即可。
#include
#include
using namespace std;
#include
struct list
;struct list*
creat
(int n)
//建立迴圈鍊錶
head-
>last = tail;
//首尾相連
tail-
>next = head;
//首尾相連
return head;
}void
delperson
(struct list* p)
cout <<
"請輸入m"
<< endl;
int m;
int i =0;
cin >> m;
while
(tail-
>next != tail)
//如果不是只剩最後乙個節點
tail-
>next = p-
>next;
//tail的next連線p的next
p->next-
>last = tail;
cout <<
"刪除的編號是:"
<< p-
>data << endl;
free
(p);
//釋放p
p = tail-
>next;
//p移動到tail的next
} cout <<
"刪除的編號是:"
迴圈鍊錶解決約瑟夫 問題
據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所...
迴圈鍊錶解決約瑟夫環問題
題目要求的約瑟夫環操作 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人只有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個仍開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...
迴圈鍊錶解決約瑟夫環問題
問題描述 假設有n個小孩按照序號1,2,n圍坐成一圈,從第乙個小孩開始報數,每次報到n的人退出,接著從下乙個人重新開始從1開始報數,下一次再報到n的人退出,求最後乙個留下的人 小孩的個數n,和報數的n由鍵盤輸入 輸出留下人的序號 乙個迴圈鍊錶都寫得除出了很多問題,改了半天才出來 include in...