oj系列 迴圈鍊錶通俗易懂解決約瑟夫 出圈問題

2021-10-05 02:46:36 字數 1240 閱讀 5538

有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...