資料結構之線性表(順序表 鍊錶)

2021-08-28 08:10:25 字數 3929 閱讀 8755

線性表是資料結構的一種,乙個線性表是n個具有相同特性的資料元素的有限序列。線性表的邏輯結構簡單,便於實現和操作。

線性表的特徵:

(1)線性表是乙個序列

(2)n=0時,線性表是乙個空表

(3)線性表中的第乙個元素無前驅,最後乙個元素無後繼,其他元素有且只有乙個前驅和後繼。

(4)線性表是有長度的,其長度就是元素個數,且線性表的元素個數是有限的。

線性表的分類:

(1)順序表

(2)鍊錶

順序表是線性表的順序儲存方式,指的是用一組位址連續的儲存單元依次儲存線性表的資料結構。

順序表在物理儲存方式上表現為一段連續的位址空間,相同資料型別的資料元素被依次放在這個空間中。

乙個順序表需要包含三個屬性:(1)儲存空間的起始位置;(2)線性表的儲存容量;(3)線性表的當前長度

順序表的基本操作與時間複雜度:

(1)訪問 ,訪問:o(1)

(2)插入:o(n)

(3)刪除:o(n)

操作演算法說明:

(2)插入:即在表中的第i個位置插入乙個新元素.

(a)如果插入位置不合理(0或大於n),丟擲異常

(b)如果線性表長度超出空間容量,丟擲異常或動態增加空間容量

(c)從最後乙個元素開始向前遍歷到第i個位置,分別將它們向後移動一位

(d)將待插入元素填入位置i處

(e)線性表長度加1

(3)刪除:即刪除表中指定元素。

(a)如果刪除的位置不合理(0或大於n),丟擲異常

(b)刪除第i個位置的元素

(c)從刪除元素位置開始向後遍歷到最後乙個元素,分別將它們向前移動一位

(d)線性表長度減1

總結:順序表使用訪問資料,不適合經常插入和刪除資料的應用。

鍊錶是線性表的鏈式儲存方式,是由一組可連續也可不連續的記憶體結構,通過指標的形式鏈結在一起的資料型別。

鍊錶共分為3類:(1)單鏈表 (2)雙向鍊錶 (3)迴圈鍊錶

單鏈表(linked list)

單鏈表的說明:

(1)data資料+next指標,組成乙個單鏈表的資料結構。

(2)最後乙個資料元素沒有直接後繼,其next指標為空(null)

(3)單鏈錶可由頭指標唯一確定

單鏈表的基本操作與時間複雜度:

(1)查詢,訪問:o(n)

(2)插入:o(1)

首先需要從頭開始向後遍歷,直到找到第i-1個元素(這屬於查詢的過程),建立新節點,改變指標的指向。

假設待插入結點為s,第i-1個結點為p, s -> next = p -> next; p -> next = s;

(3)刪除:o(1)

首先需要從頭開始向後遍歷,直到找到第i-1個元素(這屬於查詢的過程),然後改變指標的指向。

假設待刪除結點的前乙個結點為p,p -> next = p -> next -> next;

雙向鍊錶(double linked list)

雙向鍊錶說明:

(1)prev指標+data資料+next指標,組成乙個雙向鍊錶

(2)表頭的prev指標為空(null),表尾的next指標為空(null)

雙向鍊錶的基本操作和時間複雜度:

(1)插入:

假設待插入節點為s,第i-1個結點為p,s -> next = p -> next; p -> next -> prior = s; s -> prior = p; p -> next =s;

(2)刪除:

假設待刪除結點為p,p -> prior -> next = p -> next; p -> next -> prior = p -> prior; free(p);

迴圈鍊錶(circular linked list)

迴圈鍊錶說明:

(1)迴圈鍊錶分為單向迴圈鍊錶和雙向迴圈鍊錶

(2)單向迴圈鍊錶就是在單鏈表的基礎上,把表尾的next指標指向表頭,形成乙個閉環

(3)雙向迴圈鍊錶就是在雙向鍊錶的基礎上,把表尾的next指標指向表頭,再把表頭的prev指標指向表尾,形成乙個閉環。

(4)迴圈鍊錶沒有表頭和表尾的說法

靜態鍊錶(static list)

用陣列描述的鍊錶叫做靜態鍊錶,這種描述方法叫做游標實現法。是單鏈表的另一種描述形式:即在沒有指標的時候,用陣列來替代指標來描述單鏈表。游標5

2340

6789

1011

1213

...1資料a

cde下標

0123

4567

891011

12...

999(1)先檢視下標為999的游標值為1,

(2)根據游標值1找到下標為1的資料a

(3)a對應的游標值為2

(4)根據游標值2找到下標為2的資料c

(5)c對應的游標值為3

(6)根據游標值3找到下標為3的資料d,以此類推

靜態鍊錶說明:

(1)data資料+cur下標(即儲存data下乙個元素坐在陣列中對應的下標),組成乙個靜態鍊錶。

(2)下標為0的結點data區不包含任何資料

(3)陣列的最後乙個結點的cur存放第乙個結點(是指有實質意義的資料的結點)的下標

靜態鍊錶操作:

(1)插入:

(a)以上表為例,首先是獲得空閒量的下標,即當前陣列第乙個元素的游標值(cur值)5,就是第乙個備用空閒的下標值,然後找到下標值為5的元素對應的游標值6,將陣列第乙個元素的游標值改為6

(b)在下標值為5的資料單元中放入插入值data,並將其游標值修改為0

(c)若插入值為末位,則直接將下標為4的資料對應的游標改為5,否則迴圈查詢要插入值的上一位,並對應將下標為4的游標值改為5

(2)刪除:

(a)首先是找到要刪除結點的下標,假如要刪除下標為2的元素c,則將c的上乙個元素游標值改為3

(b)找到空閒值的游標5,將要刪除節點的游標值改為5,將空閒值的游標值改為刪除元素的下標值。

鍊錶總結:

(1)單鏈表可以方便的在鍊錶尾部插入節點,但不支援高效的表尾刪除操作。

(2)雙向鍊錶相比單鏈表的優勢在於它同時支援高效的正向及反向遍歷,並且可以方便的在鍊錶尾部刪除結點。

(3)迴圈鍊錶被視為「無頭無尾」,迴圈鍊錶的無邊界使得在這樣的鍊錶上設計演算法會比普通鍊錶更加容易。

(4)靜態鍊錶具有鏈式儲存結構的優點,缺點是不能實現動態分配。

儲存類別

順序表單鍊錶

儲存方式

一段連續的儲存單元依次儲存線性表的資料元素

鏈式儲存,用一組任意的儲存單元存放線性表的資料元素

時間效能

查詢o(1),插入和刪除o(n)

查詢o(n),插入和刪除o(1)

空間效能

需要預先分配儲存空間,分大了浪費,分小了溢位

不需要預分配儲存空間,只要有就可以分配,元素個數不受限制

(1)若線性表需要頻繁查詢,很少進行插入和刪除操作時,宜採用順序表的儲存結構;若需要頻繁插入和刪除,宜採用單鏈表儲存結構。

(2)順序表使用陣列事項, 一組位址連續的儲存單元,陣列大小有兩種方式指定,一是靜態分配,而是動態擴充套件。

(3)順序表有隨機訪問特性,儲存密度高,邏輯上相鄰的元素,無力商業相鄰,但是插入刪除需要移動大量元素。

(4)鏈式儲存結構允許儲存空間不連續,插入刪除時不需要移動大量的元素,只需要修改指標即可。但是查詢某元素只能從頭遍歷。

資料結構 線性表(順序表 鍊錶)

線性表 1 線性表是一種邏輯結構,表示一種一對一的邏輯關係,除首節點和尾節點,每個結點只有乙個前驅結點和乙個後繼結點 2 兩種實現的物理結構 順序儲存,鏈式儲存 順序表 1 定義 用一組位址連續的儲存單元,一次儲存線性表中的元素,使得邏輯位置相鄰的元素物理位置也相鄰。2 特點 順序表元素的位序從1開...

資料結構線性表之順序表

純手打順序表相關操作,包括順序表的建立 初始化 輸出 插入 刪除 銷毀等,僅供自己回顧使用,可能會有不對的或者不恰當的地方望大家指正,共同學習。如下 資料結構順序表 include include include define maxsize 100 using namespace std type...

資料結構 線性表之順序表

線性表是包含若干資料元素的乙個線性序列 記為 l a0,ai 1,ai,ai 1 an 1 l為表名,ai 0 i n 1 為資料元素 n為表長,n 0 時,線性表l為非空表,否則為空表。線性表l可用二元組形式描述 l d,r 即線性表l包含資料元素集合d和關係集合r d r 關係符在這裡稱為有序對...