1.單鏈表
所謂的單鏈表就是鍊錶最基本的結構,鍊錶通過指標將一組零散的記憶體塊串聯在一起,其中,我們把記憶體塊稱為鍊錶的「節點」。為了所有的節點能串起來,每個鍊錶的節點除了儲存資料之外,還需要激勵鍊錶上的下乙個節點的位址,如圖所示,我們把這個記錄下個節點的位址的指標叫做後繼指標next,如果鍊錶中某個節點為p,p的下乙個節點為q,我們可以描述為:p->next=q
下面的圖更加詳細的描述了單鏈表的儲存結構。
從我畫的單鏈表的圖中,你應該可以發現,其中有兩個節點是比較特殊的,他們分別是第乙個節點和最後乙個節點,我們習慣性地把第乙個節點叫做頭結點,把最後乙個節點叫做尾結點。其中,頭節點用來記錄鍊錶的基位址,有了它,我們就可以遍歷得到整個鍊錶,而尾結點特殊的地方是:指標不是指向下乙個節點,而是指向乙個空位址null,表示是鍊錶的最後乙個節點。
與陣列一樣,鍊錶也支援資料的查詢、插入和刪除操作。
我們知道,在進行陣列的插入和刪除操作時,為了保持記憶體資料的連續性,需要做大量的資料挪移。而在鍊錶中插入或者刪除乙個資料,我們並不需要為了儲存記憶體的連續性和搬移節點,以為鍊錶的空間本來就不是連續的,所以在鍊錶中插入和刪除資料是非常快速的。
為了方便理解,我畫了一張圖,從圖中我們可以看出,針對鍊錶的插入和刪除操作,我們只需要考慮相鄰節點指標的改變。cahru
2.迴圈鍊錶
迴圈鍊錶是一種特殊的單鏈表,實際上,迴圈鍊錶也很簡單,它跟單鏈表唯一的區別就是尾結點。我們知道,單鏈表的尾結點指標指向空位址,表示這就是最後的節點了。而迴圈鍊錶的尾結點指標是指向鍊錶的頭結點,從畫的迴圈鍊錶的圖來看,它看起來像乙個環一樣的頭尾相連,所以叫做迴圈鍊錶,和單鏈表相比,迴圈鍊錶的優點就是從鏈尾到鏈頭比較方便。當要處理的資料具有環形結構特點時,就特別適合採用迴圈鍊錶,迴圈鍊錶的圖如下所示:
3.雙向鍊錶
單向鍊錶只有乙個方向,節點只有乙個後繼指標next指向後面的節點。而雙向鍊錶,顧名思義,它支援兩個方向,每個節點不止有乙個後繼指標next指向後面的節點,還有乙個前驅指標prev指向前面的節點:
4.雙向迴圈鍊錶
了解了迴圈鍊錶和雙向鍊錶,如果把這兩種鍊錶整合在一起就是乙個雙向迴圈鍊錶。
Redis list鍊錶型別
list型別其實就是乙個雙向鍊錶。通過push,pop操作從鍊錶的頭部或者尾部新增刪除元素。這使得list既可以用作棧 上進上出 也可以用作佇列 上進下出 list型別操作 ipush key string 在key對應list的頭部新增字串元素 rpop key 從list的尾部刪除元素,並返回刪...
所有型別的鍊錶問題
stnode createlink int a,int n return h stnode createlink int a,int n return h stnode createlink int a,int n return h stnode createlink int a,int n ret...
線性表型別的實現 鍊錶映像
用一組位址任意的儲存單元存放線性表中的資料元素。以元素 資料元素的映象 指標 指示後繼元素儲存位置 結點 表示資料元素 或 資料元素的映象 以 結點的序列 表示線性表 稱作鍊錶 結點和單鏈表的 c 語言描述 單鏈表的儲存結構定義 typedef struct lnode lnode,linklist...