C語言 資料結構迴圈鍊錶解決約瑟夫環問題

2021-08-20 23:17:02 字數 2563 閱讀 3745

用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個人,而當輪最後拿到刀子的人會將他的下乙個人殺掉,殺完後刀子會再傳給被殺的下乙個人。這樣一輪就算結束。...