單鏈表的實現與分析
回顧一下鍊錶元素的組成;乙個資料成員和乙個指向鍊錶中下乙個元素的指標。結構 體listelmt表示鍊錶中的單個元素(見例項5-1).如你所料,這個結構體擁有兩個成員,就是前面介紹的資料成員和指標成員。結構體系list則表示鍊錶這種資料結構(見例項5-1).這個結構體由5個成員組成;size表示鍊錶中的元素個數;match並不有鍊錶本身使用,而是有從鍊錶資料結構派生而來的新型別所使用;destroy是封裝之後傳遞給list_init的析構函式;head是指向鍊錶中頭結點元素的指標;tail則是指向鍊錶中末尾結點元素的指標。
list_init用來初始化乙個鍊錶以便能夠執行其他的操作(見例項5-2).初始化鍊錶是一宗簡單的操作,只要把鍊錶的size成員設定為0,把函式指標成員destroy設定為定義的析構函式,head和tail指標全設定為null即可。
list_init的複雜度為o(i),因為初始化過程中的所有步驟都能在一段恆定的時間內完成。
list_destory用來銷毀鍊錶(見示例5-2),其意義就是移除鍊錶中的所有元素。如果呼叫list_init時destory引數不為null,則當每個元素被移除時都呼叫list_destrory一次。
list_destroy的執行時複雜度為o(n),n代表鍊錶中的元素個數,這是因為list_rem_next的複雜度為o(1), 而移除每個元素時都呼叫list_rem_next一次。
list_ins_next
list_ins_next將乙個元素插入由element引數所制定的元素之後(見示例5-2)該呼叫將新元素的資料指向有使用者傳遞進來的資料。向鍊錶中插入新元素的處理步驟很簡單,但需要特別小心。有兩種情況需要考慮:插入鍊錶頭部和插入其他位置。
一般來說,要把乙個元素插入鍊錶中,需要將新元素的next指標指向它之後的那個元素,然後將新元素位置之前的結點next指標指向新插入的元素(見圖5-3).但是,當從鍊錶頭部插入時。新元素之前沒有別的結點了。因此,在這種情況下,將新元素的next指標指向當前鍊錶的頭部,然後重置頭結點指標,使其指向新元素。回顧一下前一節中的介面設計,當傳入的element為null時代表新的元素將插入鍊錶頭部。另外需要注意的是。無論何時當插入的元素位於鍊錶末尾時,都必須更新鍊錶資料結構的tail成員使其指向新的結點。最後,更新統計鍊錶中結點個數的size成員。
list_rem_next從鍊錶中移除由element所指定的元素之後的那個結點(見示例5-2).移除element之後的那個結點而不是移除elenent本身,關於為何要這樣設計將在「問與答」中進行討論。通插入結點類似,這個呼叫也需要考慮兩個因素:移除的是頭結點以及移除其餘位置上的結點。
移除操作時很簡單的,但同樣需要注意一些細節問題(見圖5-4).一般來說,為了從鍊錶中移除vhuyige元素,將要移除的目標結點前乙個元素的next指標指向目標結點的下乙個元素。但是,移除的目標結點是頭結點時,目標結點之前並沒有其他元素了。因此。在這種情況下,子需要將鍊錶的head成員指向結點的下乙個元素。同插入 操作一樣。當傳入的element為null時代表鍊錶的頭結點需要移除。另外,無論何時當移除的目標結點是鍊錶的尾部結點時,都必須更新鍊錶結構資料中的tail成員,使其指向 新的尾結點,或者當移除操作似的整個鍊錶成為空煉表時需要tail設定為null.
最後,更新鍊錶的szie成員,使其減1.當這個呼叫返回時data將指向已移除結點的資料域。
這些巨集實現了鍊錶中的一些簡單操作(見示例5-1).一般來說,它們提供了快速訪問和檢測list和listelmt結構體成員的能力。
這些操作的執行時複雜度是o(1),因為訪問和檢測結構體的成員都可以在恆定的時間內完成。
演算法精解二十(C語言版)
資料結構 鍊錶 鍊錶可以數是一種最為基礎的資料結構,鍊錶有一組元素以一種特定的順序組合或鏈結在一起,在維護資料的集合時很有用。這一點同我們常用到的陣列很相似。然而,鍊錶在很多情況下比陣列更有優勢。特別是在執行插入和刪除操作時鍊錶擁有更高的效率。鍊錶需要動態地開闢儲存空間,也就是儲存空間是在程式執行時...
演算法精解二十五(C語言版)
雙向鍊錶介面的定義 描述初始化有引數list所指定的雙向鍊錶。該函式必須在雙向鍊錶做其他任何操作之前呼叫。當呼叫dist destroy時,這裡傳入的destroy引數提供了一種釋放動態分配空間的方法。它的工作方式同前面敘述的list destroy.對於雙向鍊錶,如果其中包含不需要手動釋放空間的資...
演算法精解二十七(C語言版)
迴圈鍊錶的介紹 迴圈鍊錶是另一種形式的鍊錶,它提供了更為靈活的遍歷鍊錶元素的能力。迴圈鍊錶可以單向的或雙向的,單區分乙個鍊錶是不是迴圈鍊錶只要看它有沒有尾部元素即可。在迴圈鍊錶中,最後乙個元素的next指標又回頭元素而不是設定為null。在雙向迴圈鍊錶中,頭元素的prev指標則指向最後乙個元素,這使...