鍊錶和順序表

2021-09-25 18:49:15 字數 2693 閱讀 1354

順序表一般可以分為:

1、靜態順序表:使用定長陣列儲存

2、動態順序表:使用動態開闢的數值儲存

//順序表的靜態儲存

#define n 100

typedef int sldatatype;

typedef struct seqlist

seqlist;

//順序表的動態儲存

typedef struct seqlist

seqlist;

順序表的動態儲存:

缺點

1)在順序表中做插入、刪除操作時,平均移動表中的一半元素,因此n較大的順序表效率低。

2) 靜態分配,程式執行之前必須明確規定儲存規模預先分配足夠大的儲存空間,估計過大,可能會導致順序表後部大量閒置;預先分配過小,又會造成溢位。

2、鍊錶:

在鍊錶中邏輯上相鄰的資料元素,物理儲存位置不一定相鄰,它使用指標實現元素之間的邏輯關係。並且,鍊錶的儲存空間是動態分配的。

優點

插入、刪除運算方便。

缺點

1)要占用額外的儲存空間儲存元素之間的關係,儲存密度降低。儲存密度是指乙個節點中資料元素所佔的儲存單元和整個節點所佔的儲存單元之比。

2)鍊錶不是一種隨機儲存結構,不能隨機訪問元素。

順序表和煉表的區別

1、順序表和煉表都具有增、刪、查、改的相同功能,但演算法複雜度卻不相同。

增:

1)順序表往指定位置,不覆蓋的新增乙個值,後面的值日要往後移動,演算法複雜度為o(n);

2)鍊錶往指定位置新增乙個節點,需要從表頭遍歷到指定位置,演算法複雜度為o(n),如果帶有索引的節點,演算法複雜度為o(1)。

1)順序表指定位置,刪除乙個值時,需要將後面的值向前移動,演算法複雜度為o(n);

2)鍊錶指定乙個位置,刪除乙個時,如果沒有對指定節點進行索引,需要從表頭遍歷到指定位置,然後將指定節點刪除,演算法複雜度為o(n), 如果對指定節點做索引,刪除節點的演算法複雜度為o(1)。

1)順序表直接查詢指定位置值演算法複雜度為o(1);

2)鍊錶需要遍歷節點到指定位置,演算法複雜度為o(n);如果節點指定位置節點有索引,演算法複雜度為o(1).

:修改其實就是查詢修改值的位置,再對值進行修改。

1)順序表的增和刪表數量規模比較大時,平均移動一半的元素,效率不高。

2) 對於有索引的鍊錶,新增和刪除只需要o(1)演算法複雜度,效率高。因此,鍊錶用於頻繁的新增和刪除資料時,有優勢。

2、從記憶體角度

(1)順序表是由陣列組成的線性表,陣列是一組位址連續的單元儲存塊,分配於棧區,可以自動釋放。

(2)鍊錶是由不連續的位址節點組成的線性表,每個節點可以是乙個單元的位址塊或連續位址塊,分配於堆區,節點必須手動釋放。記憶體管理比較不方便。

3、時間上的比較(time)

順序表和煉表區別:

共同點:

1.都是線性表

2.元素邏輯儲存上是連續的

3.每個元素都有唯一的前驅以及唯一的後繼。注意:第乙個元素沒有前驅,最後乙個元素沒有後繼—迴圈鍊錶除外

不同點:

1.底層儲存空間不同:順序表底層空間是連續的鍊錶底層空間不連續

⒉插入和刪除方式不同:

順序表任意位置插入和刪除需要搬移大量的元素,效率低,時間複雜度為o(n)

鍊錶任意位置插入和刪除不需要搬移元素,效率高,時間複雜度為o(1)

3.隨機訪問:

順序表底層空間連續,支援隨時訪問,訪問任意位置元素時間複雜度為o(1)

鍊錶底層空間不連續,不支援隨機訪問,訪問任意位置元素時間複雜度為o(n)

4.擴容:

順序表在插入時候需要進行擴容—開闢新空間、拷貝元素、釋放舊空間

鍊錶:插入時候不需要進行擴容

5.空間利用率:

一般情況順序表空間利用率比較高

鍊錶中的元素儲存在乙個乙個的節點中,而每個節點都是malloc出來的:頻繁向堆申請小的記憶體塊–記憶體碎片、效率低

6.應用場景不同:

順序表適合:元素高效儲存以及隨機訪問操作比較多的場景

鍊錶:適合任意位置插入和刪除比較頻繁的場景

7.快取利用率:鍊錶的快取利用率比順序表低

鍊錶和順序表習題(一)

鍊錶順序表 每個元素的訪問 每個節點都需要通過指標找到記憶體然後載入到快取中 記憶體訪問時,不需要多次從記憶體到快取的步驟 頭插,頭刪,中間位置 直接增加或刪除節點 在插入或刪除之前要先對之後的資料進行挪動 尾插,尾刪 需要對空間進行操作 直接對資料進行操作,空間是之前一次性開闢好的 空間操作 每次...

鍊錶和順序表的區別

都屬於線性表,都是線性結構 順序表 順序儲存 優點 支援隨機訪問 儲存密度高 缺點 大片連續空間分配不方便,改變容量不方便 鍊錶 鏈式儲存 優點 離散的小空間分配方便,改變容量方便 缺點 不可隨機訪問,儲存密度低 創銷 增刪改 查 順序表 順序儲存 需要預分配大片連續空間。若分配空間過小,則之後不方...

c 封裝雙向鍊錶和順序表

null 乙個節點 else 多個節點 void pushfront const datatype data else void popfront else if tail ppre null 乙個節點 else 多個節點 node find const datatype data cur cur ...