資料結構 陣列與鍊錶

2021-10-19 17:48:31 字數 3788 閱讀 3965

陣列的特點

1.在記憶體中,陣列是一塊連續的區域

2.陣列需要預留空間,在使用前需要提前申請所佔記憶體的大小,不知道需要多大的空間,可能會浪費記憶體空間,即陣列空間利用率低

3.在陣列起始位置處,插入資料和刪除資料效率低。

插入資料時,待插入位置的的元素和它後面的所有元素都需要向後搬移

刪除資料時,待刪除位置後面的所有元素都需要向前搬移

4.隨機訪問效率很高,是一種隨機訪問結構,時間複雜度可以達到o(1)

因為陣列的記憶體是連續的,想要訪問哪個元素,直接從陣列的首位址處向後偏移就可以訪問到了

5.陣列開闢的空間,在不夠使用的時候需要擴容,擴容的話,就會涉及到需要把舊陣列中的所有元素向新陣列中搬移

6.陣列的空間是從棧分配的

陣列的優點

隨機訪問性強,查詢速度快,時間複雜度為o(1)

陣列的缺點

1.頭插和頭刪的效率低,時間複雜度為o(n)

2.空間利用率不高

3.記憶體空間要求高,必須有足夠的連續的記憶體空間

4.陣列空間的大小固定,不能動態拓展

鍊錶的特點

1.在記憶體中,元素的空間可以在任意地方,空間是分散的,不需要連續

2.鍊錶中的元素至少都會兩個屬性,乙個是資料域,儲存資料,另乙個是指標域,此指標標記了下乙個元素的位址

3.查詢資料時效率低,只能順序訪問,時間複雜度為o(n)

因為鍊錶的空間是分散的,所以不具有隨機訪問性,如要需要訪問某個位置的資料,需要從第乙個資料開始找起,依次往後遍歷,直到找到待查詢的位置,故可能在查詢某個元素時,時間複雜度達到o(n)

4.空間不需要提前指定大小,是動態申請的,根據需求動態的申請和刪除記憶體空間,擴充套件方便,故空間的利用率較高

5.任意位置插入元素和刪除元素效率較高,時間複雜度為o(1)

6.鍊錶的空間是從堆中分配的

鍊錶的優點

1.任意位置插入元素和刪除元素的速度快,時間複雜度為o(1)

2.記憶體利用率高,不會浪費記憶體

3.鍊錶的空間大小不固定,可以動態拓展

鍊錶的缺點

隨機訪問效率低,時間複雜度為0(n)

陣列為隨機訪問,鍊錶為順序訪問

1.當線性表的長度變化較大,難以預估規模時,應該選擇鍊錶

2.當線性表的長度變化不大,容易事先確定規模時,為了節約儲存空間,應該選擇陣列

3.對於想要快速訪問資料,不經常有插入和刪除元素的時候,選擇陣列

4.對於需要經常的插入和刪除元素,而對訪問元素時的效率沒有很高要求的話,選擇鍊錶

陣列我們已經比較熟悉了,下面主要是鍊錶的使用

下述內容基於嚴蔚敏是c語言版資料結構教材,**有些為偽**

定義:首元結點:鍊錶中儲存第乙個資料元素的結點

頭節點:在首元結點前附設的乙個結點,其指標域指向首元結點。頭結點的資料域可以不儲存任何資訊,也可以儲存其他附加資訊,如線性表的長度等。

頭指標:指向鍊錶中第乙個結點的指標,若設有頭節點,則頭指標指向頭節點,否則指向首元結點

鍊錶新增頭節點的好處:

1.便於對首元結點的處理

首元結點的位址儲存在頭節點中,對其操作可以和其他結點一樣,無需特殊處理

2.便於空表和非空表的統一處理

新增頭節點後,無論鍊錶是否為空,頭指標都指向頭節點。當鍊表為空時,頭結點的指標域為空。

鍊錶結點定義

typedef struct lnode lnode,

*linklist;

1.鍊錶的建立

void initlist

(linklist &l)

2.鍊錶的取值

int

getelem

(linklist& l,

int i)if(

!p || j > i)

//i值不合法,i>n或者i<=0;

return

;int e = p-

>data;

return e;

}

3.鍊錶的按值查詢結點

lnode*

locateelem

(linklist& l,

int e)

return p;

}

4.鍊錶的插入

void listinsert

(linklist& l,

int i,

int e)if(

!p || j > i -1)

//i不合法,i>n+1或者i<1

return

; s =

new lnode;

s->data = e;

s->next = p-

>next;

p->next = s;

}

5.鍊錶的刪除

void listdelete

(linklist& l,

int i)if(

!p->next || j > i -1)

//i非法,i>n或者i<1

return

; q = p-

>next;

p->next = q-

>next;

delete q;

}

鍊錶的刪除和插入while處條件不同是因為插入的合法位置有n+1個,而刪除只有n個

前插法建立鍊錶

後插法建立鍊錶

void createlist

(linklist& l,

int n)

}

迴圈鍊錶迴圈鍊錶的特點是最後乙個結點的指標域指向頭結點,形成乙個環。

由此,從表中任何乙個結點出發均可找到其他結點。

與單鏈表的差別在於:

判斷是否為表尾時不同,單鏈表為p!=null或者p->next!=null;/迴圈鍊錶為p!=l或者p->next!=l;

雙向鍊錶

顧名思義,該鍊錶中每個結點有兩個指標域,乙個指向直接前驅,乙個指向直接後繼

該特點方便了某些需求的操作,但在插入和刪除時要修改其前後兩個結點的指標域

陣列與鍊錶的異同(資料結構)

c 語言中可以用陣列處理一組資料型別相同的資料,但不允許動態定義陣列的大小,即在使用 陣列之前必須確定陣列的大小。而在實際應用中,使用者使用陣列之前有時無法準確確定陣列的大小,只能將陣列定義成足夠大小,這樣陣列中有些空間可能不被使用,從而 造成記憶體空間的浪費。鍊錶是一種常見的資料組織形式,它採用 ...

資料結構與演算法(1)陣列與鍊錶

學習極客時間資料結構與演算法之美總結 陣列是在記憶體上連續的記憶體空間。陣列隨機查詢演算法複雜度為o 1 但是插入和刪除都為o n 這個要看情況,要是資料不是按照順序的話,那麼直接把目標位置替換成新的值,然後將舊的值放到最後,這樣演算法複雜度依然為o 1 刪除的時候把刪除的地方做標記,等到空間不足的...

資料結構 順序表與鍊錶

順序表插入操作 temp seqlist list temp賦值為乙個結構體變數 for i temp length i pos i pos是插入的位置,注意是ta是下標 temp i int node 放新結點 temp length 刪除操作 for int i pos 1 ilength i ...