1樓:煙問玉
我使用了另一種方法,不需要構建環形連結串列也可以,只需要用一個陣列標記已離開的猴子即可,相對比較簡單。這個程式輸出猴子離開的順序,最後輸出的即為大王。
#include
#include
#include
#include
int main()
while (not_in[pos]);
}printf("%d ", pos);
not_in[pos] = 1;
}printf("\n");
return 0;}
2樓:
一:實驗內容:
m只猴子要選大王,選舉辦法如下:所有猴子按1,2……n編號圍成一圈,從第一號開始順序1,2……m,凡是報m號的退出圈外,如此迴圈報數直到圈內只剩一隻猴子時這隻猴子就是大王。
二:實驗要求:
利用單向迴圈連結串列模擬此過程,輸出選出的大王編號。
三:程式的設計思想:
(1) 問題分析:「猴子選大王」問題是約瑟夫環問題的一個特例。由於本題目的資料元素個數不可知,所以可使用連結串列來動態的分配記憶體空間。
而該問題又是一個不斷的迴圈問題所以用迴圈連結串列來實現。
(2) 總體設計:首先生成一個空連結串列,並給n個結點分配空間,讓單連結串列的表尾指標指向頭結點則生成一個帶有n個結點的迴圈單連結串列。再給每隻猴子建立順序的編號。
現從第一個結點開始報數,依次順序查詢出報數為m的待出列的結點(猴子)通過q->next=p->next刪除該結點後繼續執行否則讓q成為p的前驅指標。最後當p->next==p時停止執行,得到p所指向的結點即為猴子選出大王的編號。
四、源程式
#include
#include
/* 定義連結串列節點型別 */
typedef struct node
linklist;
int main()
/* 找到第 k 個節點 */
p = head;
for (i = 1; i < k; i++)
/* 儲存節點總數 */
total = n;
printf("\nout of sequence:");
q = head;
/* 只剩一個節點時停止迴圈 */
while (total != 1)
/* 列印要刪除的節點序號 */
printf("[%d] ", p->data);
/* q 指向 p 節點的前驅 */
while (q->next != p)
/* 刪除 p 節點 */
q->next = p->next;
/* 儲存被刪除節點指標 */
s = p;
/* p 指向被刪除節點的後繼 */
p = p->next;
/* 釋放被刪除的節點 */
free(s);
/* 節點個數減一 */
total--;
}/* 列印最後剩下的節點序號 */
printf("\n\n king of the monkey is the no. [%d] \n\n", p->data);
free(p);
system("pause");
return 0;}
資料結構題目求答案,資料結構題目求答案
3.28 void initciqueue ciqueue q 初始化迴圈連結串列表示的佇列q initciqueue 把元素x插入迴圈列表表示的佇列q,q指向隊尾元素,q next指向頭結點,q next next指向隊尾元素 從迴圈連結串列表示的佇列q頭部刪除元素x deciqueue 3.31...
acm題目課程設計高手進駐,acm題目 課程設計 高手進駐 3!!!
你的這個演算法太複雜。半徑為1是最好算的。知道弧度後就知道弦長了。弧度與弦的關係是l 2 2 r sin a 2 其中 a是弧度,l是弦長。而弧度與弧長的關係是 s ra其中 r是半徑。計算面積就更容易了,一個是扇面積減三角形面積,一個是扇面積加三角形面積。把圓心與弦兩端連起來就知道了 不多說了,看...
資料結構“時間複雜度”的題目,資料結構 有關時間複雜度題目 求高手!求詳細解釋
o表示法首先要弄清楚什麼用它來代表的上限的漸近執行時間的演算法函式g n o g n 代表了一組函式。介紹到演算法書定義 o g n 看到上面也可以忽略不明白,你只需要知道在低階項的漸近積極的作用,在確定上限和下限,可以忽略不計,因為當n大,他們相對來說並不重要,指數最高的專案上腳的一小部分已經超越...