由單鏈表向後續鍊錶的延伸

2021-09-29 15:47:41 字數 1922 閱讀 1087

在正式講解鍊錶的拓展問題時,我再談談我對鍊錶框架的看法。

鍊錶的組成成員是結點,但是只有結點是不行的,還需要有鍊錶的框架。這就需要乙個函式來初始化鍊錶,想要敲出乙個函式並不是太難,但是想要你的函式在整個程式中正常執行往往還缺很多,主要原因還是缺乏對於框架性知識的理解,所以在寫鍊錶的時候,首先是定義結點,然後要購買結點,然後初始化鍊錶,最後將結點插入完成鍊錶。

單項迴圈鍊錶

單項迴圈鍊錶和單鏈表相差不大,只不過是將尾指標的後繼指向了頭,區別在於鍊錶初始化的時候修改last指標的指向,last的後繼指標不再指向null,而是指向頭結點的位置,注意就是在建立時用的頭插法和尾插法最後需要修改last指標的指向。在顯示函式的時候不再是遇到空訪問停止,而是遇到頭結點訪問停止。

來看一下主要建立鍊錶的核心**

void

listinit

(slist* psl)

bool listpushback

(slist* psl,

int y)

bool listpushfront

(slist* psl,

int y)

else

psl->size++

; psl->last->next = psl->first;

return true;

}

顯示函式

void

listshow

(slist* psl)

}

雙向鍊錶:

雙向鍊錶和單鏈表差別也不大,雙鏈表相比較單鏈表而言在指標域多了指向前驅結點的指標,這就造成了雙鏈表進行增刪查改等的基礎操作上有了很大的該變,同時又方便了很多。因為雙向鍊錶的時候有了前驅指標這條鏈,就不容易造成鍊錶的斷鏈。來看下面**。

首先是建立節點,這個節點會多乙個prew指標來記錄結點的前驅。

typedef

struct dlistnode

dlistnode;

//建立乙個節點

接下來就是這個鍊錶的怎麼來建立

還是和單鏈表一樣有乙個記錄頭的指標和乙個記錄尾的指標,還有乙個記錄鍊錶長度的無符號整型變數。

在初始化化煉表的時候首先指向鍊錶的2個指標指向頭,而且頭的位址為空。

基本上建立完成後就是完成這個雙鏈表的各項功能,基本上掌握了單鏈表其他鍊錶基本上就能掌握了,因為這裡面的區別不大。

當然我們需要一種更高階的形式展現鍊錶,不能像之前那樣用啥將函式寫出來呼叫,我們需要做個選單。來看**

while(1

)

b. 鍊錶的頭尾插

bool dlistpushback

(slist *psl,

int x)

psl->last->next = s;

s->prew = psl->last;

psl->last = s;

psl->last->next = psl->first;

psl->first->prew = psl->last;

psl->size++

;return true;

}

bool dlistpushfront

(slist* psl,

int x)

else

return true;

}

c. 鍊錶的顯示

void

showdlist

(slist* psl)

}}

剩下操作和單鏈表差異不大,總之想掌握好鍊錶還是需要下和很多功夫,鍊錶的實際操作來說並不算難,但是卻很容易出錯,希望大家和我一起在不斷練習當中慢慢掌握好它,整整做到學以致用。

單鏈表 鍊錶倒置

鍊錶屬於動態資料結構,可以模擬成一 環 接一 環 的鏈條,這裡每一 環 視作乙個結點,結點串在一起形成鍊錶。這種資料結構非常靈活,結點數目無須事先指定,可以臨時生成。每個結點有自己的儲存空間,結點間的儲存空間也無需連線,結點之間的串連由指標來完成,指標的操作又極為靈活方便,無須移動大批資料,只需修改...

鍊錶之單鏈表

上週給前端的小夥伴們進行了講課,想著總結一下,但是直到推到現在,我才開始。上週講課的內容是es6和鍊錶。我大致把鍊錶的內容總結一下,也算是個回顧。一 初始鍊錶 鍊錶定義 使用一組任意的儲存單元儲存線性表的資料元素 可連續,也可是不連續 它是一種順序儲存。也就是說,鍊錶是線性結構,各個元素的儲存位置都...

鍊錶(LinkList) 單鏈表

一 鍊錶的基本概念 鍊錶是一種物理上不連續 非順序的儲存結構,資料元素之間通過指標關聯在一起。鍊錶的特點 1 空間開銷大 物理空間不連續 2 可以動態新增新的節點 3 查詢元素只能按順序查詢 二 單向鍊錶圖示 節點 class node 鍊錶 class linklist linklist void...