演算法 關於約塞夫問題,單迴圈鍊錶

2022-07-15 18:00:19 字數 1191 閱讀 8038

借鑑了別人的**,在經過自己的理解

/*設有n個人圍成一圈 , 編號從1到n ,

約定從編號為k(1 <= k <= n)的人從1開始報數 ,

數到 m 的那個人被淘汰 , 接著下乙個人重新從1開始報數 ,

數到 m 再淘汰一人 , 如此反覆 , 直至剩下最後乙個人為止

我們可以知道約瑟夫問題是乙個不斷迴圈而且資料不斷減少的過程 , 使用單向迴圈鍊錶可以很方便地對資料進行刪除 , 而且遍歷鍊錶非常方便

理清思路過程:

1、首先乙個帶有n個結點的單迴圈鍊錶 , 從第k個人開始從1報數

2、 需要將頭指標指向第k個人 , 輔助刪除指標指向第(k-1)個人

3、 定義輔助刪除指標的意義是為了方便當第k個人淘汰時 , 可以很方便的將第(k-1)的next指標指向第(k+1)個人

4、當人數剩下乙個人時 , 則認為這場遊戲已經結束了 , 最後剩下的那個人就是勝利者

*/#define _crt_secure_no_warnings

#include

#include

typedef struct node linklist;

linklist * creatlist(int n)//建立鍊錶,結點個數為n

p->next = head;

return head;//頭指標

int find(linklist *a,int k , int m)

printf("第%d個人的值為%d\n", k, a->data);//思路正確,從第k個人開始計數,故指標要相應移動

linklist *q = a;

while (a->next != a) //a->next == a代表只剩下乙個人

printf("被刪除的數為%d\n", a->data);

q->next = a->next; //將q指向被刪除人的下乙個人

free(a);//將a所指向的空間釋放,但a指標仍然存在,應該置為空指標a=null;

a = q->next;//將下乙個人給a

}//跳出迴圈後只剩乙個人

printf("最後活下來的是%d\n", a->data);

約瑟夫環問題(單迴圈鍊錶實現)

大致思路 1.利用尾插法建立乙個迴圈鍊錶 建表成功後刪除頭結點 2.核心演算法 生成乙個work指標,每走到約定的step 1的位置時停止,利用pdel指標標記後繼結點,迴圈釋放pdel,直到work work next停止 include include include using namespa...

魔術師發牌問題(單迴圈鍊錶)

魔術師發牌問題,魔術師拿出13張黑桃撲克牌表演魔術,對底下觀眾講道,我只要數數就知道這張牌是什麼,然後數到1翻出來第一張a,並將a拿出來放到桌子上,用剩下的牌,重新數,數到2拿出來第2張牌.以此內推,求魔術師用怎樣的牌序才能達到此目的。首先分析問題,我們可以得到乙個大致的類似鍊錶牌序為 1 2 3 ...

魔術師撲克牌問題 單迴圈鍊錶

這個程式剛開始寫完的時候爆出了一堆bug。有幾點要說一下,作為初學者,應該是會不經意間就範的。1.對迴圈鍊錶的空判斷。當迴圈鍊錶為空的時候,自身的下一指標指向自身。2.釋放鍊錶後忘記對最後的指標進行迴圈設定。if 0 程式名稱 poker 作用 模擬魔術師發牌 描述 第一張牌為1,第二張牌就要從第二...