用c語言實現迴圈鍊錶解決問題
具體測試
假設有n個人圍成一圈,然後對每個人按順序編號1,2,3,…,n,規定從1號按順序開始報數,報到k的人出局,之後下乙個人再從1開始報數,報到k的人在出局,一直進行下去,問:最後乙個出局者為幾號?
假設有8個人,每次報數報到4的人出局,則過程如下。
四號出局
八號出局
五號出局
二號出局
一號出局
三號出局
七号出局
所以最後乙個出局者為6號。
可以建立乙個迴圈鍊錶來解決像此類的有關迴圈的問題。
/* 節點 */
typedef
struct node
* pt,node;
/* 迴圈鍊錶建立 */
void creat (pt * head,
int numb)
// head為 node **型,值傳遞
current->next =
(*head)
->next;
//尾節點指回頭結點
}
這裡刪除用到了一種特殊的方法。/* 解決約瑟夫問題 */
intyue
(int m,
int n)
// m為總人數,n為報數的次數
/* 刪除當前編號 */
prev = current->next;
current->number = current->next->number;
current->next = current->next->next;
free
(prev);}
return current->number;
// 返回最後乙個人的編號
}
prev = current->next;
//記錄下乙個節點
/* 將下乙個節點的所有資料搬過來 */
current->number = current->next->number;
current->next = current->next->next;
free
(prev)
;// 釋放下乙個節點
如果要刪除乙個已知的節點,不知道其前乙個節點, 但是不能遍歷鍊錶,即要求時間複雜度為o(1),則可以使用這種方法。
這種方法無法刪除最後乙個節點, 但迴圈鏈不存在該問題.
#include
#include
typedef
struct node
* pt,node;
void
creat
(pt * c,
int a)
;int
yue(
int m,
int n)
;int main ()}
void creat (pt * c,
int a)
current->next =
(*c)
->next;
}int
yue(
int m,
int n)
prev = current->next;
current->number = current->next->number;
current->next = current->next->next;
free
(prev);}
return current->number;
}
結果: golang資料結構之用迴圈鍊錶解決約瑟夫環問題
josephu.go package link import fmt type kid struct func addkid num int kid cur kid if num 1 for i 1 i num i if i 1 else cur.next tmpkid cur tmpkid cur...
資料結構 單項迴圈鍊錶解決約瑟夫問題
x個人圍成一圈,每個人手裡都有不同的密碼,選擇乙個人,從他開始,以他的密碼為初始開始報數,如果有人報的數字為1,這個人退出並且以退出這個人手中的密碼作為新的起始,直到所有人都出列他為止 標頭檔案 不說了 struct man typedef struct man node typedef node ...
C語言迴圈鍊錶解決約瑟夫問題
joseph problem 35分 題目內容 實作joseph problem.假設一開始有n個人,編號1 n,按照順序以順時針圍成乙個圓圈。遊戲開始時,編號1的人拿刀。之後每一輪刀子會被往下傳m個人,而當輪最後拿到刀子的人會將他的下乙個人殺掉,殺完後刀子會再傳給被殺的下乙個人。這樣一輪就算結束。...