|
|
順序存儲結構 | 單鏈表 |
存儲分配方式 | 連續存儲單元依次存儲 | 鏈式存儲結構,用任意存儲單元存放線性表 | |
時間性能 | 查找 | O(1) | O(n) |
插入和刪除 | O(n) | O(1) | |
空間性能 | 需要預分配,分大了浪費,分小了容易溢出 | 不受限制 |
3 線性表
1. 線性表概念:零個或多個數據元素的有限序列
2. 線性表的順序存儲結構
2.1 線性表順序存儲結構的概念:用一段地址連續的存儲單元一次存儲線性表的數據元素。
2.2 線性表順序存儲結構的優缺點
優點:
(1)無須爲表示表中元素之間的邏輯關係而增加額外的存儲空間
(2)可以快速存取表中任意位置的元素
缺點:
(1)插入、刪除操作需要移動大量元素
(2)當線性表長度變化較大,難以確定存儲空間的容量
(3)造成存儲空間的“碎片”
3. 線性表的鏈式存儲結構
3.1 鏈式存儲結構的概念:n個節點鏈接成一個鏈表,即爲線性表的鏈式存儲結構
3.2 頭結點 頭指針
頭指針:鏈表中第一個節點的存儲位置叫做頭指針。
頭指針指向鏈表第一個節點的指針
頭指針冠以鏈表的名字作爲鏈表的標示
無論鏈表是否爲空,頭指針均不爲空
頭結點:在鏈表中第一個節點前附設一個節點,稱爲頭結點。
爲了操作的統一設立的,數據域一般沒有意義
有了頭結點對鏈表第一個節點的操作和其他節點一致
頭結點不是鏈表必要的
3.3 單鏈表的插入
流程:
1. 聲明一指針p指向鏈表頭結點,初始化j從1開始;
2. 當j<i是,就遍歷鏈表,讓p的指針向後移動,不斷指向下一節點,j累加1;
3. 若到鏈表末尾p爲空,則說明第i個節點不存在
4. 查找成功,存在,將元素e的值賦給s
5. s->next=p.next; p->next = s;
6. 返回成功
3.4 單鏈表的刪除
流程:
1. 聲明一指針p指向鏈表頭結點,初始化j從1開始;
2. 當j<i是,就遍歷鏈表,讓p的指針向後移動,不斷指向下一節點,j累加1;
3. 若到鏈表末尾p爲空,則說明第i個節點不存在
4. 查找成功,存在,q=p->next;
5. p.next=q.next;
6. 將q節點中的數據賦值給e,作爲返回;
7. 釋放q節點,Java:q=null; c:free(q);
8. 返回成功
3.5 單鏈表的整表創建
頭插法思路:
1.聲明一個指針p和計數器i
2.初始化一空鏈表L
3.讓L的頭結點的指針指向NULL,即建立一個帶頭節點的單鏈表
4.循環;{
1. 生成一新節點賦值給p
2. 隨機生成一數字賦給p的數據域p->data
3. 將p插入到頭結點和第一個新節點之間
}
尾插法思路:
1. 聲明一個指針p和計數器i
2. 初始化空鏈表L和尾指針t
3. 讓頭結點指針指向NULL,建立一個帶頭結點的單鏈表
4. 循環{
1. 生成一個新節點p;
2. t->next = p;
3. t = t.next;
}
3.6 單鏈表的整表刪除
算法思路:
1. 聲明一個節點p和q;
2. 將第一個節點賦值給p;
3. 循環{
將下一個節點賦值給q
釋放p
將q賦值給p
}
3.7 單鏈表和順序存儲結構的優缺點
3.8 靜態鏈表
概念:用數組描述的鏈表叫做靜態鏈表
數組每個元素有兩部分組成,數據data,指針cur
數組第一個元素的cur指向的是第一個空的數據位,最後一個元素cur指向第一個插入元素的下標
3.9 循環鏈表
概念:將單鏈表中的終端節點指針端由空指針改爲指向頭節點,就使整個單鏈表形成一個環,這種頭尾相接的單鏈表成爲單循環鏈表,簡稱循環鏈表
單鏈表判斷結尾的條件,p->next == 頭結點
通常單鏈表由於訪問頭尾方便的需求,用尾指針來表示循環鏈表
將兩個單鏈表合併成爲一個鏈表的操作思路:
設有兩個單鏈表 rearA, rearB
1. temp = rearA.next; 將A的頭指針暫存
2. rearA.next = rearB.next.next; 將B的頭接到A的尾
3. rearB.next = temp; 將隊尾指向頭指針
3.10 雙向鏈表
概念:雙向鏈表是在單鏈表的每個節點中,再設置一個指向其前驅節點的指針
要在p和p.next之間插入s,流程:
1. s.prior = p;
2. s.next = p.next; // 先設置s的前驅後繼
3. p.next.prior = s; // 再設置下一個的前驅
4. p.next = s; // 最後設置p的後繼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.