有n個小孩圍成一圈,給他們從1開始依次編號,從編號為1的小孩開始報數,數到第m個小孩出列,然後從出列的下乙個小孩重新開始報數,數到第m個小孩又出列,…,如此反覆直到所有的小孩全部出列為止,求整個出列序列。 如當n=6,m=5時的出列序列是5,4,6,2,3,1。
// 約瑟夫問題
#include
#include
typedef
struct node
child;
//建立無頭結點
void
createlist
(child *
&head,
int n)
tc->next = head;
//構成乙個首結點為head的迴圈單鏈表
}// 求解過程出列順序b
void
joseph
(int n,
int m)
q = p-
>next;
//q指向第m個結點
printf
("%d "
, q-
>no)
;//該結點出列
p->next = q-
>next;
//刪除q結點
free
(q);
//釋放其空間
head = p-
>next;
//從下乙個結點重新開始}}
intmain()
若是要求輸入多組,只輸出最後乙個出圈的人,則作小改動即可。
如下改動:
// 求解過程出列順序b
void
joseph
(int n,
int m)
q = p-
>next;
//q指向第m個結點
k = q-
>no;
//用k記錄每乙個
p->next = q-
>next;
//刪除q結點
free
(q);
//釋放其空間
head = p-
>next;
//從下乙個結點重新開始
}printf
("%d\n"
, k)
;//最後輸出的k即最後乙個
}int
main()
return0;
}
資料結構與演算法 通俗易懂說鍊錶
鍊錶 linked list 由一些節點組成,物理儲存非連續的線性表。其中每個節點都會儲存下個節點的指標,由於實際儲存空間不連續,對鍊錶插入節點,刪除節點可以達到o 1 的複雜度,但是對乙個節點的訪問需要o n 的時間。鍊錶有單向鍊錶,雙向鍊錶。結構體表示為 單向鍊錶節點資料結構 插入節點操作 單向...
迴圈鍊錶實現解決約瑟夫問題
typedef struct tag circlelist 頭節點 tcirclelist circlelist circlelist creat memset ret,0,sizeof tcirclelist ret header.next null ret slider null ret len...
約瑟夫問題 迴圈鍊錶簡單解決
約瑟夫求生最初版本 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josep...