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

2021-06-28 21:28:16 字數 1999 閱讀 9331

迴圈鍊錶的介紹

迴圈鍊錶是另一種形式的鍊錶,它提供了更為靈活的遍歷鍊錶元素的能力。迴圈鍊錶可以單向的或雙向的,單區分乙個鍊錶是不是迴圈鍊錶只要看它有沒有尾部元素即可。

在迴圈鍊錶中,最後乙個元素的next指標又回頭元素而不是設定為null。在雙向迴圈鍊錶中,頭元素的prev指標則指向最後乙個元素,這使得玄幻鍊錶中的每乙個元素可以看做頭元素也可以看作尾元素。

和單向迴圈鍊錶和雙向迴圈鍊錶不同,在變數迴圈鍊錶元素的時候不需要擔心到達鍊錶尾部而無法繼續遍歷下去了。相反,變數過程會繼續從煉表頭元素開始,如果是雙向迴圈鍊錶,還可以繼續從尾部元素反向遍歷。這種形式遍歷就形成了一種循模式(見圖5-7),這也是迴圈鍊錶得名的原因。

本節後面介紹的迴圈鍊錶是單向迴圈鍊錶。因此,我們需要考慮的僅僅是維護尾元素與頭元素的關係,是尾元素的next指標指向頭元素。在實際應用中到底是選擇單向迴圈鍊錶還是雙向迴圈鍊錶,理由同前面所述的選擇非迴圈單向鍊錶和雙向鍊錶方法一樣。

迴圈鍊錶介面的定義

描 述用來初始化由引數list所指定的迴圈鍊錶。該函式必須在迴圈鍊錶做任何其他操作之前呼叫。當clist_destroy被呼叫時,這裡傳入的destroy引數提供了一種釋放動態分配空間的方法。它的工作方式同前文敘述的list_destroy相似。對於迴圈鍊錶,如果其中包含不需要手動釋放空間的資料,則destrory  引數應該設定為null.

描述  銷毀由引數list所指定的迴圈鍊錶。呼叫clist_destroy之後,其他任何操作都不允許再執行,除非使用者再次呼叫clist_init.函式clist_destroy將迴圈鍊錶中的所有元素都移除。如果傳給clist_init的引數destroy不為null的話,則呼叫destroy所指定的函式,對鍊錶中每個移除的元素資料實行資源**操作。

描  述 將元素插入有list指定的迴圈鍊錶中element之後。當插入恐龍鍊錶中時,element可能指向任何位置,為了避免混淆,element此時應該設定為null。新的元素包含乙個指向data的指標,因此只要該元素仍在鍊錶中時,data所引用的記憶體空間就應該保持合法。有呼叫者負責管理data所引用的儲存空間。

描  述 移除由引數list指定的迴圈鍊錶element後面的元素。返回,引數data將指向已移除元素中儲存的資料。由呼叫者負責管理與data相關聯的儲存空間。

描述  這是乙個巨集,用來計算由引數list所指定的鍊錶的人元素個數。

描  述  這是乙個巨集,用來返回由引數list所指定的迴圈鍊錶的頭元素。

描 述  這是乙個巨集,用來返回迴圈鍊錶中由引數element所指定的元素中儲存的資料域。

描述  這是乙個巨集,用來返回迴圈鍊錶中由引數element所指定的元素的後續元素。

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

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

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

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

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

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