線性的順序儲存資料,而是在每乙個節點裡存到下乙個節點的指標(pointer)。由於不必須按順序儲存,鍊錶的插入和刪除操作可以達到o(1)的複雜度。本文將講解單向鍊錶和雙向鍊錶,其中雙向鍊錶會給出部分關鍵**實現。
單向鍊錶(單鏈表)是鍊錶的一種,它由節點組成,每個節點都包含下乙個節點的指標,下圖就是乙個單鏈表,表頭為空,表頭的後繼節點是"結點10"(資料為10的結點),「節點10"的後繼結點是"節點20」(資料為10的結點),…
我們看看單鏈表刪除節點的操作,比如說下面這個單鏈表中我們要刪除"節點30"。
刪除之前:「節點20」 的後繼節點為"節點30",而"節點30" 的後繼節點為"節點40"。
刪除之後:「節點20」 的後繼節點為"節點40"。
我們再來看看單鏈表新增節點的操作,比如說下面這個單鏈表中我們在"節點10"與"節點20"之間新增"節點15"
新增之前:「節點10」 的後繼節點為"節點20"。
新增之後:「節點10」 的後繼節點為"節點15",而"節點15" 的後繼節點為"節點20"。
雙向鍊錶(雙鏈表)是鍊錶的一種。和單鏈表一樣,雙鏈表也是由節點組成,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈鍊錶。
雙鏈表的示意圖如下:
表頭為空,表頭的後繼節點為"節點10"(資料為10的節點);「節點10"的後繼節點是"節點20」(資料為10的節點),「節點20"的前繼節點是"節點10」;「節點20"的後繼節點是"節點30」,「節點30"的前繼節點是"節點20」;…;末尾節點的後繼節點是表頭。
不難看出,雙向鍊錶的節點定義可以用乙個下面的結構體表示:
//雙向鍊錶節點結構
typedef
struct dlink_node
node;
我們看看雙向鍊錶刪除節點的操作,比如說下面這個單鏈表中我們要刪除"節點30"。
刪除之前:「節點20"的後繼節點為"節點30」,「節點30」 的前繼節點為"節點20"。「節點30"的後繼節點為"節點40」,「節點40」 的前繼節點為"節點30"。
刪除之後:「節點20"的後繼節點為"節點40」,「節點40」 的前繼節點為"節點20"。
雙向鍊錶刪除節點的關鍵**如下:
//刪除節點pindex
pindex-
>next-
>prev = pindex-
>prev;
pindex-
>prev-
>next = pindex-
>next;
free
(pindex)
;//注意釋放節點
我們再來看看雙向鍊錶新增節點的操作,比如說下面這個雙向鍊錶在"節點10"與"節點20"之間新增"節點15"
新增之前:「節點10"的後繼節點為"節點20」,「節點20」 的前繼節點為"節點10"。
新增之後:「節點10"的後繼節點為"節點15」,「節點15」 的前繼節點為"節點10"。「節點15"的後繼節點為"節點20」,「節點20」 的前繼節點為"節點15"。
雙向鍊錶新增節點的關鍵**如下:
//將pnode節點插入到pindex之前
pnode-
>prev = pindex-
>prev;
pnode-
>next = pindex;
pindex-
>prev-
>next = pnode;
pindex-
>prev = pnode;
資料結構 鍊錶
鍊錶 what 就是一張鏈式儲存的表,是一種資料結構,是基礎,所以還是不要想有什麼用。具體呢?在c中就用結構體實現物件描述,然後通過函式來實現各個基本操作 c 則用類來表述,c中的結構體就可以看成c 中的類,然後通過類封裝各個操作步驟。這些操作實現後就需要 來測試,號稱demo,就是main函式裡面...
資料結構 鍊錶
鍊錶中的資料是以節點來表示的,每個結點的構成 元素 資料元素的映象 指標 指示後繼元素儲存位置 元素就是儲存資料的儲存單元,指標就是連線每個結點的位址資料。鍊錶的結點結構 data next data域 存放結點值的資料域 next域 存放結點的直接後繼的位址 位置 的指標域 鏈域 以 結點的序列 ...
資料結構 鍊錶
一般的建立線性鍊錶有兩種 1.正序法 需要三個指標,head作為頭指標,pre作為前乙個指標,cur作為當前指標用來建立空間 2.倒序法,利用指標的插入,只需要兩個指標,不斷的往頭指標後插入新空間,不過插入的越早,離頭指標越遠,也就越後面輸出 1.線性鍊錶的建立及查詢刪除 include inclu...