陣列需要一塊連續的記憶體用來儲存資料,而鍊錶恰恰相反,它並不需要一塊連續的記憶體,它通過指標將不連續的記憶體塊串起來。
鍊錶結構很多,我們說下最常見的,單鏈表,雙向鍊錶和迴圈鍊錶。
我們先看比較簡單的單鏈表
如上圖可以看出來,圖中的每個節點不僅需要儲存資料,還需要記錄乙個指向下乙個節點的指標,如圖所示,我們把記錄下乙個節點的指標叫做後繼指標 next
圖中有兩個節點比較特殊第乙個節點我們叫做頭節點,最後乙個節點我們叫做尾結點,頭節點記錄了這個鍊錶的基位址,尾節點的指標不是指向乙個節點,而是指向乙個空位址null。
我們知道在陣列的插入和刪除操作後,為了保持連續記憶體的特點需要搬移大量資料,而在鍊錶中我們不需要保持連續記憶體的結構,所有我們在鍊錶中插入和刪除操作時時間要比在陣列中操作刪除新增速度快,
針對鍊錶的插入和刪除操作可以看下圖
但是有利就有弊,在鍊錶中查詢資料的時候就沒有陣列那麼快了,在陣列中可以首位址和下標可以很快查出來,因為是連續的,但是在鍊錶中由於不是連續的,我們就需要根據指標節點乙個乙個遍歷才能查詢出需要的資料。
接下來我們看下迴圈鍊錶,其實迴圈鍊錶就是一種特殊的單鏈表
迴圈鍊錶就是尾結點指向鍊錶的頭節點,而不是指向乙個空值,有點就是從鍊錶尾部查詢到鍊錶頭部很方便,在處理某些特殊的資料結構時很有用處。
最後我們在看下雙向鍊錶
單鏈表只有乙個方向,只有乙個後繼指標next指向下乙個節點,而雙向鍊錶有兩個指標,它還有乙個前驅指標,顧名思義,就是指向前乙個節點的指標。
從圖中可以看出,雙向鍊錶需要儲存額為乙個指標,所以在儲存相同資料的情況下,雙向鍊錶要比單鏈表占用更多的記憶體空間,雖然兩個指標比較浪費儲存空間,但是可以支援雙向遍歷,帶來了更多的靈活性。
鍊錶vs陣列效能大比拼
陣列簡單易用,在實現上用連續的記憶體,在查詢的時候cpu可以通過預讀快取提高查詢效率,而鍊錶由於不是連續的所以對cpu快取不友好。
陣列確定是由於記憶體連續,所以當空間不夠時,需要再去申請一塊記憶體,然後在搬移資料,很費事,而鍊錶大小沒有限制,天然的支援動態擴容,這個是和陣列最大的區別。
這兩種資料結構各有優劣,在實際開發中需要根據實際情況去選擇。
資料結構 鍊錶
鍊錶 what 就是一張鏈式儲存的表,是一種資料結構,是基礎,所以還是不要想有什麼用。具體呢?在c中就用結構體實現物件描述,然後通過函式來實現各個基本操作 c 則用類來表述,c中的結構體就可以看成c 中的類,然後通過類封裝各個操作步驟。這些操作實現後就需要 來測試,號稱demo,就是main函式裡面...
資料結構 鍊錶
鍊錶中的資料是以節點來表示的,每個結點的構成 元素 資料元素的映象 指標 指示後繼元素儲存位置 元素就是儲存資料的儲存單元,指標就是連線每個結點的位址資料。鍊錶的結點結構 data next data域 存放結點值的資料域 next域 存放結點的直接後繼的位址 位置 的指標域 鏈域 以 結點的序列 ...
資料結構 鍊錶
一般的建立線性鍊錶有兩種 1.正序法 需要三個指標,head作為頭指標,pre作為前乙個指標,cur作為當前指標用來建立空間 2.倒序法,利用指標的插入,只需要兩個指標,不斷的往頭指標後插入新空間,不過插入的越早,離頭指標越遠,也就越後面輸出 1.線性鍊錶的建立及查詢刪除 include inclu...