資料結構 線性表

2021-10-23 22:20:34 字數 2332 閱讀 2105

1.什麼是線性表

線性表是 n 個資料元素的有限序列,最常用的是鏈式表達,通常也叫作線性鍊錶或者鍊錶。在鍊錶中儲存的資料元素也叫作結點,乙個結點儲存的就是一條資料記錄。每個結點的結構包括兩個部分:

仔細觀察上圖,你會發現這個鍊錶只能通過上乙個結點的指標找到下乙個結點,反過來則是行不通的。因此,這樣的鍊錶也被稱作單向鍊錶。

有時候為了彌補單向鍊錶的不足,我們可以對結點的結構進行改造:

對於乙個單向鍊錶,讓最後乙個元素的指標指向第乙個元素,就得到了迴圈鍊錶;

或者把結點的結構進行改造,除了有指向下乙個結點的指標以外,再增加乙個指向上乙個結點的指標。這樣就得到了雙向鍊錶。

同樣的,還可以對雙向鍊錶和迴圈鍊錶進行融合,就得到了雙向迴圈鍊錶,如下圖所示:

2.線性表的增刪查

我們主要介紹單向鍊錶的增刪查操作

新增

刪除

p.next = p.next.next;
只能遍歷查詢

總結

鍊錶在新增、刪除資料都比較容易,可以在 o(1) 的時間複雜度內完成。但對於查詢,不管是按照位置的查詢還是按照數值條件的查詢,都需要對全部資料進行遍歷。這顯然就是 o(n) 的時間複雜度。

雖然鍊錶在新增和刪除資料上有優勢,但仔細思考就會發現,這個優勢並不實用。這主要是因為,在新增資料時,通常會伴隨乙個查詢的動作。例如,在第五個結點後,新增乙個新的資料結點,那麼執行的操作就包含兩個步驟:

第一步,查詢第五個結點;

第二步,再新增乙個資料結點。整體的複雜度就是 o(n) + o(1)。

線性表真正的價值在於,它對資料的儲存方式是按照順序的儲存。如果資料的元素個數不確定,且需要經常進行資料的新增和刪除時,那麼鍊錶會比較合適。如果資料元素大小確定,刪除插入的操作並不多,那麼陣列可能更適合些。

3.線性表案例

例 1鍊錶的翻轉。給定乙個鍊錶,輸出翻轉後的鍊錶。例如,輸入1 ->2 -> 3 -> 4 ->5,輸出 5 -> 4 -> 3 -> 2 -> 1。

對於某個單向鍊錶,它的指標結構造成了它的資料通路有去無回,一旦修改了某個指標,後面的資料就會造成失聯的狀態。為了解決這個問題,我們需要構造三個指標 prev、curr 和 next,對當前結點、以及它之前和之後的結點進行快取,再完成翻轉動作。

注:轉正網路,侵刪

while

(curr)

例 2給定乙個奇數個元素的鍊錶,查詢出這個鍊錶中間位置的結點的數值。

注:轉正網路,侵刪

while

(fast && fast.next && fast.next.next)

例 3判斷鍊錶是否有環。如下圖所示,這就是乙個有環的鍊錶。

假設鍊錶有環,快指標每次走兩格,而慢指標每次走一格,相對而言,快指標每次迴圈會多走一步。這就意味著:

如下圖所示:

資料結構(線性表)

1.試寫一演算法,在無頭結點的動態單鏈表上實現線性表操作insert l,i,b 並和在帶頭結點的動態單鏈表上實現相同操作的演算法進行比較。status insert linklist l,int i,int b 在無頭結點鍊錶l的第 i個元素之前插入元素 belse insert 2.已知線性表中...

資料結構 線性表

參考 一 線性表 順序表 單鏈表 迴圈鍊錶 雙鏈表 順序表 1.表的初始化 void initlist seqlist l 2.求表長 int listlength seqlist l 3.取表中第i個結點 datatype getnode l,i 4.查詢值為x的結點 5.插入 具體演算法描述 v...

資料結構 線性表

線性表是最基礎的一種資料結構,這樣的資料物件包含的資料元素具有一對一的前驅後繼關係。按其邏輯儲存方式的不同可分為兩類線性表 順序表和鏈式表。其中鏈式表又可分為線性鍊錶 迴圈鍊錶和雙向鍊錶。下面分別介紹下這幾種線性表的資料結構 1.順序表 typedef struct sqlist 插入演算法 i到n...