資料結構 01 線性表的基本實現和概念

2021-10-23 09:37:03 字數 1732 閱讀 7915

線性表的定義:

線性表是具有相同特徵性資料元素的乙個有限序列。該序列中所含元素的個數叫做線性表的長度。一般用n(n >= 0)來表示。當n = 0時,線性表為空表。

線性表的儲存結構:

線性表的儲存結構有順序儲存結構和鏈式儲存結構,順序儲存結構被稱為順序表。鏈式儲存結構被稱為鍊錶。

a為順序表,b為鍊錶

在順序表中7個元素是緊挨著的,即連續地占用了一片空間。如果要對已有的元素進行新增或者修改,並不會使之變大,也不會減小。

順序表要求占用連續的儲存空間,儲存分配只能預先進行。一旦分配好了,以後不管怎麼操作都始終不變。

在圖中我們看到,順序表中最右邊有乙個表結點空間是沒有被利用的。假如說我要在中間插入元素,比如說b和c之間要插入乙個新元素,那麼c和後面的元素就要集體往後移乙個位置,而鍊錶的話呢,就不需要這麼麻煩。

順序表的結構體定義

#define maxsize 10	

//順序表的初始大小

typedef

struct

list;

//順序表型別的定義

鍊錶的結點可以散落在記憶體中的任意位置,且不需要一次性劃分所有結點所需的空間給鍊錶,而是根據需求臨時劃分。因此,鍊錶支援儲存空間的動態分配。

鍊錶的插入操作無需移動多個元素,只需要更改箭頭指示即可。

每個結點中除了包含資料域外,還包含乙個指標域。用於指向後續結點。

圖為帶頭結點的單鏈表

帶頭結點的單鏈表中,頭指標head指向頭節點。頭節點的值域不含任何資訊。從頭節點的後繼結點開始儲存。頭指標head始終不等於null。當head->next等於null的時候,鍊錶為空。

單鏈表結點的定義

typedef

struct node node;

在單鏈表中只能從頭走到尾,而不能從尾反向走到頭。如果要求從終端結點走到開始結點的資料序列,則對於單鏈表的操作就非常麻煩。因此,我們就有了雙鏈表。

雙鏈表結點的定義

typedef

struct node node;

a為單鏈表,b為雙鏈表

儲存方式

順序表採用一組位址連續的儲存單元依次存放資料元素,通過元素之間的先後順序來確定元素 之間的位置,因此儲存空間的利用率較高。

時間效能比較

順序表查詢的時間複雜度為 o(1),插入和刪除需要移動元素,因此時間複雜度為 o(n)。若是需 要頻繁的執行查詢操作,但是很少進行插入和刪除操作,那麼建議使用順序表。

鍊錶查詢的時間複雜度為 o(n),插入和刪除無需移動元素,因此時間複雜度為 o(1)。若是需 要頻繁的執行插入和刪除操作,但是很少進行查詢操作,那麼建議使用鍊錶。

根據序號來插入和刪除節點,需要通過序號來找到插入和刪除節點的位置,那麼整體的 時間複雜度為 o(n)。因此,鍊錶適合資料量較小時的插入和刪除操作,如果儲存的資料量較大, 那麼就建議使用二叉樹或者其他資料結構實現。

空間效能比較

順序表需要預先分配一定長度的儲存空間,如果事先不知道需要儲存元素的個數,分配空間過 大就會造成儲存空間的浪費,分配空間過小則需要執行耗時的擴容操作。

單鏈表不需要固定長度的儲存空間,可根據需求來進行臨時分配,只要有記憶體足夠就可以分配, 在鍊錶中儲存元素的個數是沒有限制的,無需考慮擴容操作。

01 資料結構之線性表

記錄資料結構之線性表的 實現 typedef struct vector vector vector init int n void clear vector v int expand vector v if p null return 0 v data p v size extr size ret...

資料結構 線性表的實現

1.順序表 pragma gcc optimize 2 include include include include include include include include include include include include include include include in...

資料結構基本之線性表

2.2順序表插入 順序表儲存結構 define maxsize 100 typedef structlist define ok 1 define error 0 在順序表l中第i個資料元素之前插入乙個元素e。i的合法取值範圍1 i last 2 int inslist list l,int i,t...