這節來說下順序表和煉表
1)集合中必存在唯一的「第乙個元素」
2)集合中必存在唯一的「最後乙個元素」
3)除第乙個元素外,其他的元素都只有乙個後繼
4)除最後乙個元素外,其他的元素都只有乙個前驅
把線性表中的節點按照邏輯次序儲存在一組連續的位址單元中,在計算機中以陣列的形式儲存的線性表。
在順序表中每個節點的儲存位址都是該節點在儲存位置的線性函式,只要知道基位址和每個節點的大小,就可以找出任意乙個節點。是一種
隨機儲存結構
。
#define maxsize 100 //表空間的大小可根據實際需要而定,這裡假設為100
typedef int datatype;
typedef struct seqlist
seqlist;
1)儲存的資料型別都相同
2)可以在任意位置進行插入和刪除
用一組任意的儲存單元來儲存線性表的節點。它的形式是資料+指標,資料就是儲存的資料元素,指標就是指向下乙個資料的位址,將每乙個孤立的節點鏈結起來
1)是一種鏈式儲存方式
2)鍊錶中的節點的邏輯次序和物理次序可能不相同
typedef struct node
node;
1) 空間的開闢,順序表一般是連續的開闢一段空間,然後進行資料的增刪改查,因此空間大小是固定的(靜態順序表),而鍊錶是實時的進行節點的申請和刪除,所以空間是動態的,不固定大小。(動態順序表是為了彌補靜態順序表的缺陷,空間還可以進行擴容)
2) 當我們不知道要儲存多少資料的時候,使用順序表會造成空間的浪費,而鍊錶是需要乙個資料才申請乙個節點,比起順序表來說能在一定程度上節省空間。但是當我們知道要儲存多少資料的時候使用順序表最好,不會造成空間的浪費,而使用單鏈表就會造成記憶體碎片。
3)對cpu快取記憶體的影響:
因為順序表的空間一般是連續開闢的,而且一次會開闢儲存多個元素的空間,所以在使用順序表時,可以一次把多個資料寫入快取記憶體,再寫入主存,順序表的cpu快取記憶體效率更高,且cpu流水線也不會總是被打斷;而單鏈表是每需要儲存乙個資料才開闢一次空間,所以每個資料儲存時都要單獨的寫入快取記憶體區,再寫入主存,這樣就造成了,單鏈表cpu快取記憶體效率低,且cpu流水線會經常被打斷。
從這兒看,貌似順序表要更好一些,真是如此嗎?繼續看下去。
②、時間上的比較(time)
a. 訪問隨機元素的時間複雜度:
因為順序表的結構就像是陣列一樣,可以用下標來訪問它的元素,所以它的元素是支援隨機訪問的;相比之下,單鏈表的資料是鏈式儲存的,它的元素是不支援隨機訪問的,想要知道某個元素,只能從頭結點開始遍歷整個鍊錶,知道找到了該元素為止。因此順序表訪問隨機元素的時間複雜度是o(1),而單鏈表訪問隨機元素的平均時間複雜度是o(n)。
b. 隨機位置插入、刪除元素的時間複雜度:
因為順序表的元素是連續儲存的,因此要在特定位置插入、刪除元素需要把它之後的元素全部後移或前移乙個元素的位置,時間開銷很大;而單鏈表在插入或刪除元素時,只需要改變它的前驅元素及插入或刪除元素的指向即可。因此,順序表在插入隨機位置插入、刪除元素的平均時間複雜度是o(n),單鏈表在插入隨機位置插入、刪除元素的時間複雜度是o(1)。
一般來說線性表(順序表和單鏈表都屬於線性表)的插入刪除操作會被執行的頻繁一些,因此,使用單鏈表的頻率較大
【小結】:
綜合上述所言,順序表和單鏈表各有各的優缺點,使用哪一種會好一些要結合具體的問題而言,不能一概而論。
比如:在查詢操作使用的比較頻繁時,使用順序表會好一些;在插入、刪除操作使用的比較頻繁時,使用單鏈表會好一些。
我在網上看到一張還比較好的表,大家可以結合我上面的描述,進行檢視。
C 實現順序表和煉表
更多c 知識 c 目錄索引 順序表 vector.h pragma once typedef int datatype class vector vector.cpp include vector.h include using namespace std vector vector 構造 firs...
順序表和煉表
定義 線性表是由n個具有相同特性的資料元素組成的有限序列,表中每個元素具有相同元素。邏輯上為連續的線性結構。常見的線性表 順序表,鍊錶 棧 佇列 字串 線性表根據物理儲存方式分為 順序表和煉表 線性表在邏輯上是線性結構,在物理上並不是連續的,線性表在物理上儲存時,通常是以陣列和鏈式結構的形式儲存。動...
順序表和煉表
1.名詞解釋 資料 對客觀事物的符號表示 資料元素 資料的基本單位,可由若干個資料項組成 資料項 資料的不可分割的最小單位 資料物件 性質相同的資料元素的集合,是資料的子集 資料結構 相互之間存在特定關係的資料元素的集合 關係描述資料元素之間的邏輯關係 物理結構 儲存結構 資料結構在計算機中的表示 ...