陣列的特點
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 ...