演算法精解二十八(C語言版)

2021-06-28 22:07:25 字數 1449 閱讀 6791

迴圈鍊錶的實現與分析

同單鏈表一樣,迴圈鍊錶中的每乙個元素也包含兩部分;乙個資料域指標和乙個指向後續元素的next指標。資料結構 clistelmt代表迴圈鍊錶中的單獨元素(見示例5-6)。如你所料,這個結構體擁有兩個成員,與前面所述的一致。資料結構clist代表迴圈鍊錶(見示例5-6).這個結構體同單鏈表類似,但它不包含tail成員。

clist_init

clist_init操作用來初始化乙個迴圈鍊錶以便稍後能夠執行其他操作(見示例5-7).初始化過程同非迴圈的單鏈表一樣,只是這裡迴圈鍊錶沒有tail成員而已。

clist_init的執行時複雜度為o(1),因為初始化過程中的所有步驟都能在恆定的時間內完成。

clist_destroy

clist_destroy用來銷毀乙個迴圈鍊錶(見示例5-7)。總的來說,該操作意味著將移除鍊錶中的所有元素。當傳遞給該函式的destroy不為null時,每移除乙個元素時都將呼叫clist_init一次。

clist_ins_next

clist_ins_next用來將新元素插入迴圈表中由引數element所指定的元素之後(見示例5-7)。將元素插入單向迴圈鍊錶中的過程同非迴圈的單鏈表類似。最大的不同在於當所插入的鍊錶是空煉表時。在這種情況下,必須將所插入元素

的next指標設定為指向它自己.這就允許迴圈遍歷只有乙個元素的鍊錶。這也確保了之後元素的插入操作能夠按照恰當的方式進行。

clist_ins_next的執行時複雜度o(1),因為插入操作中的所有步驟都能夠在恆定的時間內完成。

clist_rem_next

clist_rem_next將引數element所不指定的後繼元素從鍊錶中移除(見 示例5-7).從單向迴圈鍊錶中移除元素的過程同非迴圈的鍊錶類似。

clist_rem_next的執行時複雜度為o(1),因為移除操作中的所有步驟都能夠在恆定時間內完成。

clist_size、clist_head、clist_data以及clist_next這些巨集實現迴圈鍊錶的一些簡單操作(見示例5-6)。總的來說,這些巨集提供了訪問和檢測資料結構clist和clistelmt中的成員的介面。

以上這些巨集的執行時複雜度都為o(1),因為訪問和檢測資料結構的成員是一種簡單的操作,而且它們都能在恆定的時間內完成。

演算法精解二十(C語言版)

資料結構 鍊錶 鍊錶可以數是一種最為基礎的資料結構,鍊錶有一組元素以一種特定的順序組合或鏈結在一起,在維護資料的集合時很有用。這一點同我們常用到的陣列很相似。然而,鍊錶在很多情況下比陣列更有優勢。特別是在執行插入和刪除操作時鍊錶擁有更高的效率。鍊錶需要動態地開闢儲存空間,也就是儲存空間是在程式執行時...

演算法精解二十二(C語言版)

單鏈表的實現與分析 回顧一下鍊錶元素的組成 乙個資料成員和乙個指向鍊錶中下乙個元素的指標。結構 體listelmt表示鍊錶中的單個元素 見例項5 1 如你所料,這個結構體擁有兩個成員,就是前面介紹的資料成員和指標成員。結構體系list則表示鍊錶這種資料結構 見例項5 1 這個結構體由5個成員組成 s...

演算法精解二十五(C語言版)

雙向鍊錶介面的定義 描述初始化有引數list所指定的雙向鍊錶。該函式必須在雙向鍊錶做其他任何操作之前呼叫。當呼叫dist destroy時,這裡傳入的destroy引數提供了一種釋放動態分配空間的方法。它的工作方式同前面敘述的list destroy.對於雙向鍊錶,如果其中包含不需要手動釋放空間的資...