問題描述:
一、迴圈鍊錶實現約瑟夫問題
思路:建立乙個迴圈鍊錶,按順序依次列入結點。進行遍歷,遍歷為第 m 個的結點刪除,連線該節點的前乙個和後乙個結點,保持鍊錶的完整性
迴圈鍊錶實現的關鍵點:
1、如何搭建迴圈鍊錶
2、如何查詢並且刪除指定結點,且不影響整個鍊錶的完整性
實現:迴圈鍊錶的搭建(在研究此**前,建議先了解一下鍊錶的原理影象)
link headnode =
(link)
malloc
(sizeof
(monkey));
headnode->next =
null
;link tailnode,pnode,qnode;
while(1
)else
}}
查詢並刪除結點
link headnode =
(link)
malloc
(sizeof
(monkey));
headnode->next =
null
; link tailnode,pnode,qnode;
int answer[
300]
;int count =0;
int n,m;
int i=1;
while(1
)else}}
}
原始碼:
#include
#include
typedef
struct monkeymonkey,
*link;
intmain()
else
pnode = headnode->next;
//對要進行遍歷查詢的指標進行初始化
i =1;
qnode = tailnode;
//這個指標指向遍歷查詢的指標的前乙個結點,便於結點的刪除操作
while
(pnode != qnode)
else}}
headnode->next = qnode;
//該語句是保障頭結點與最後留下的結點保持鏈結
answer[count]
= pnode->data;
//用陣列記錄此次迴圈找到的「猴王」
count++
;free
(pnode)
; headnode->next =
null
;//再初始化頭結點
}for
(int j=
0;j)//遍歷每次找到的猴王
printf
("%d\n"
,answer[j]);
return0;
}
二、陣列下標實現約瑟夫問題思路:定義乙個陣列,初始化存在猴子的元素。遍歷時如果元素為0,則跳過,如果元素不為0,則將該元素變為0,直到陣列中只剩下乙個陣列元素不為0
關鍵:在遍歷到最後乙個元素的時候,如何回到第乙個元素再遍歷
如何在遍歷到最後乙個元素後再回到第乙個元素
int n,m,monkey;
int count =0;
int answer[count]
;int i =1;
int pos;
while(1
)else
}else
}}
原始碼:
#include
intmain()
;//陣列初始化
for(
int j=
0;j) i =1;
monkey = n;
pos =0;
//下標標誌,重中之重的標誌
while
(monkey>1)
else
}else
}for
(int j=
0;j}}
for(
int j=
0;j)printf
("%d\n"
,answer[j]);
return0;
}
選猴王(約瑟夫問題)
一群猴子要選新猴王。新猴王的選擇方法是 讓n只候選猴子圍成一圈,從某位置起順序編號為1 n號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?整體思路 建立頭尾相連的鍊錶,將...
約瑟夫問題兩種實現方式
陣列版本 include include main int p int malloc len sizeof int printf 請輸入步長 n scanf d pace if pace 0 if pace 0 printf 請輸入進行輪數 n scanf d time printf 請輸入您想從那...
約瑟夫問題兩種實現方式
陣列版本 include include main int p int malloc len sizeof int printf 請輸入步長 n scanf d pace if pace 0 if pace 0 printf 請輸入進行輪數 n scanf d time printf 請輸入您想從那...