小試牛刀 單鏈表 雙鏈表插入與刪除

2021-06-09 06:26:56 字數 1522 閱讀 7227

在正文開始之前,先介紹下一些相關的背景知識。

首先,什麼是鍊錶?

鍊錶的實質是資料結構按照儲存結構方式劃分的一種儲存結構。如下圖1所示,

煉表不像順序儲存結構那樣,在記憶體中是一塊連續的區域,相反,鍊錶是「物理離散、邏輯聯絡」即在記憶體中,儲存單元是不連續的、彼此之間沒有順序,但是彼此之間是通過鍊錶中的指標鏈結次序聯絡在一起。

鍊錶由一系列結點(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成(這是它的乙個特色)。每個結點包括兩個部分:乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。如下圖2:

而單鏈表又分為了單鏈表、雙鏈表和迴圈鍊錶,如圖3所示,

好了,下面就來詳細的介紹一下單鏈表、雙鏈表的插入、刪除的過程。

首先來說單鏈表的刪除:以圖2為例,刪除其中的a2結點。相對來說,這是乙個比較簡單的操作。其基本思路就是將a1中的指標域指向a3,跳過a2,然後還有乙個不能忽視的操作就是釋放(free)結點a2的資源。

再來說一下單鏈表的插入:可以效仿剛剛介紹的刪除結點的思路。還是以圖2為例,在a1和a2結點之間插入乙個新的結點:將a1結點的指標域指向新結點,再將新結點的指標域指向a2就可以了。但是,這裡需要注意的是,應該是向將新結點的指標指向a2,然後在將a1的指標指向新結點。

原因是:我們用p來表示a1結點,那麼在沒有進行插入之前,a2的表示方法是p->next.如果插入時,先將a1指標域指向新結點,那麼p->next 代表的就是插入的新結點了,原來的結點就找不到了。解決的方法是(s表示插入的結點):將s->next賦值給p->next,然後令p->next=s,這樣可以實現插入了。總結如下圖,

ok,下面在來介紹一下雙鏈表的插入、刪除操作。

由圖3可以看出,雙鏈表存在這兩個指標域,乙個指向前乙個結點,另乙個指向後乙個結點。這樣對鍊錶的插入和刪除就要相對來說複雜了一點。

對於刪除操作,思路是一樣的,不同的地方只是要考慮到兩個方向,這裡就不再贅述了。

而插入操作,可以安裝先從左至右、再從右至左來實現插入就可以。當然,要注意步驟的安排。其具體步驟如圖所示:

先將新結點的前指標指向a1,再將後指標指向a2,a2前指標指向新結點,a1後指標指向新結點。

總結:其實單鏈表和雙鏈表的插入和刪除的基本思想是一致的。只是在細微處有一些差異。對於這些操作,用語言來描述不是太讓人容易理解,但是文章的插圖可以幫助我們很好的理解,一張圖勝過千言萬語。

小試牛刀 單鏈表 雙鏈表插入與刪除

在正文開始之前,先介紹下一些相關的背景知識。首先,什麼是鍊錶?鍊錶的實質是資料結構按照儲存結構方式劃分的一種儲存結構。如下圖1所示,煉表不像順序儲存結構那樣,在記憶體中是一塊連續的區域,相反,鍊錶是 物理離散 邏輯聯絡 即在記憶體中,儲存單元是不連續的 彼此之間沒有順序,但是彼此之間是通過鍊錶中的指...

單鏈表插入刪除

在鍊錶的插入刪除操作上理解起來比順序表更為容易,其不需要變動在i位置前的所有的元素,只需要修改節點指標即可。插入 設在鍊錶的i位置插入新元素,設i 1節點的指標域為p,設插入的節點指標域為s,所以插入操作應該為 s next p next 將s的字尾改為p的字尾,p的字尾是原來的第i個點的指標域,將...

單鏈表插入與刪除演算法

include include typedef char datatype typedef struct node linklist linklist initlist linklist head linklist createlist linklist head,int n head next n...