期末複習 迴圈鍊錶

2021-10-07 02:52:54 字數 2093 閱讀 6022

約瑟夫環(josephus)問題是由古羅馬的史學家約瑟夫(josephus)提出的。這個問題最初的原型是約瑟夫在公元70年的時候,在抗擊羅馬的戰鬥中一直進行頑強的抵抗,守住了裘達伯特城達47天之久,最後城市淪陷以後,他和四十多名將士就躲在乙個洞穴裡,當時大家都非常頑強說:「要投降,吾寧死」,後來約瑟夫就想了乙個辦法,我們每個人把旁邊的乙個人殺死,輪流的殺死,殺死的順序由抽籤來決定,最後他抽到了最後一簽,但他也沒殺死他旁邊的這個人,他們兩個人一起活了下來,然後投降了羅馬。

約瑟夫環(josephus)問題本身的描述為:編號為1,2,…,n的n個人按順時針方向圍坐在一張圓桌周圍,每人持有乙個密碼(正整數)。一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始報數,報到m時停止報數,報m的那個人出列,將他的密碼作為新的m值,從他順時針方向的下乙個人開始重新從1報數,數到m的那個人又出列;如此下去,直至圓桌周圍的人全部出列為止。

演算法分析:採用單向迴圈鍊錶

結點結構:id passwoed next

解決問題的基本步驟如下:

(1)建立n個結點(無頭結點)的單向迴圈鍊錶。

(2)從鍊錶第乙個結點起迴圈計數尋找第m個結點。

(3)輸出該結點的id值,將該結點的password作為新的m值,刪除該結點。

(4)根據m值不斷從鍊錶中刪除結點,直到鍊錶為空。

具體可參考

迴圈鍊錶(circular linked list):是乙個首尾相接的鍊錶。

特點:將單鏈表最後乙個結點的指標域由null改為指向頭結點或線性表中的第乙個結點,就得到了單鏈形式的迴圈鍊錶,並稱為迴圈單鏈表。在迴圈單鏈表中,表中所有結點被鏈在乙個環上。

例:有兩個帶頭結點的迴圈單鏈表la、lb,編寫乙個演算法,將兩個迴圈單鏈表合併為乙個迴圈單鏈表,其頭指標為la。

先找到兩個鍊錶的尾,並分別由指標p、q指向它們,然後將第乙個鍊錶的尾與第二個表的第乙個結點鏈結起來,並修改第二個表的尾q,使它的鏈域指向第乙個表的頭結點。

首先將la的指標p指向lb的第乙個結點,

然後將lb的頭指標釋放掉,

最後將q指標指向la的表頭結點。

時間複雜度是o(n)

linklist merge_ 1

(linklist la,linklist lb)

迴圈鍊錶(circular linked list)(帶尾指標

採用帶尾指標的迴圈鍊錶,執行時間可降低為o(1)。這個釋放結點的操作要在第二條鏈(rb->next=p)改變之前完成。

先讓la的尾指標ra指向lb的第乙個結點,

然後將lb的尾指標指向la的頭結點,同時釋放掉原來的rb->next。

時間複雜度為o(1)

linklist merge_2

(linklist ra,linklist rb)

從表中任一結點出發都能訪問到表中所有結點。

迴圈表是對稱的,為了判斷起始位置,一般要設定頭結點。頭結點的設定也可將空表和非空表的邏輯狀態及運算統一起來。

迴圈表的運算和線性鍊錶基本一致,有時可簡化某些運算。

期末複習 雙向鍊錶

在單鏈表的每個結點裡再增加乙個指向其前趨的指標域prior。這樣形成的鍊錶中就有兩條方向不同的鏈,我們稱之為雙 向 鍊錶。順序儲存的優點 1 用陣列儲存資料元素,操作方法簡單,容易實現。2 無須為表示結點間的邏輯關係而增加額外的儲存開銷。3 儲存密度高。順序儲存的缺點 1 做插入 刪除操作時,須大量...

期末複習 雜

圖 g v n,e m 無向完全圖 m n n 1 2 有向完全圖 m n n 1 無向圖g有尤拉迴路,當且僅當g是連通圖且無奇度頂點 所以選c 無向圖g有尤拉通路,但無尤拉迴路,當且僅當g是連通圖且恰好有兩個奇度頂點,這兩個奇度頂點是尤拉通路的端點 如a,d就是尤拉通路,卻不是尤拉迴路 樹設g v...

C 期末複習

首先,友元是一種定義在類外部的普通函式或類,但它需要在類體內進行說明,為了與該類的成員函式加以區別,在說明時前面加以關鍵字friend。友元不是成員函式,但是它可以訪問類中的私有成員。所以,友元宣告只能出現在類定義中。因為友元不是授權類的成員,所以它不受其所在類的宣告區域public private...