借鑑了別人的**,在經過自己的理解
/*設有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,第二張牌就要從第二...