定義
零個或者多個數據元素的有限序列;
順序儲存結構
指的是用一段地址連續的儲存單元依次存儲線性表的數據元素;
- 線性表的長度:是線性表中數據元素的個數,隨著表的插入和刪除操作的進行,這個量是變化的;
- 數據的長度:是存放線性表的存儲空間長度,存儲分配后這個量是一般不變的;
- 存儲器中的每一個存儲單元都有自己的編號,這個編號稱為地址;
獲得元素
enum Status{
case Error
case OK
}
func getElem(list:Array<Any>, i:Int, e:Any) -> Status{
if list.count == 0 || i < 1 || i > list.count {
return .Error
}
e = list[i - 1]
return.OK
}
插入操作
func listInsert(L:SqList, i:Int, e:Any) -> Status{
var j : Int
if L.length == MAXSIZE {
return .Error
}
if i < 1 || i > L.length + 1 {
return .Error
}
if i <= L.length {
for j in (i-1 ... L.length-1).reversed() {
L.data[j + 1] = L.data[j]
}
}
L.data[i - 1] = e
L.length += 1
return .OK
}
刪除
func delet(L:SqList, i:Int) -> Status{
if L.length == 0 {
return .Error
}
if i < 1 || i > L.length + 1 {
return .Error
}
if i <= L.length {
for j in (i ... L.length) {
L.data[j-1] = L.data[j]
}
}
L.length -= 1;
return .OK;
}
順序存儲結構的優缺點
優點:
1、 無須為表中元素之間的邏輯關系而增加額外的存儲空間;
2、可以快速的存取表中任一位置的元素缺點
1、 插入和刪除元素操作需要移動大量元素;
2、 當線性表的長度變化比較大時,難以確定存儲空間的容量;
3、 造成存儲空間的碎片;
鏈式存儲結構
- 我們把存儲數據元素信息的域為數據與,把存儲直接后繼位置的域稱為指針域;
- 指針域中存儲的信息稱作指針或者鏈;
- 指針域和數據域組成數據元素的存儲映像,稱為結點;
- 鏈表中每一個結點中只包含一個指針域,稱為單鏈表;
- 鏈表中,第一個節點的存儲位置稱為頭指針;
- 在單鏈表的第一個結點前附設一個結點,稱為頭結點;
頭指針 | 頭結點 |
---|---|
頭指針是指鏈表指向第一個結點的指針,若鏈表有頭結點,則是指向頭結點的指針 | 頭結點是為了操作的統一和方便而設立的,放在第一元素的結點之前,其數據域一般無意義(也可存放鏈表的長度。) |
頭指針具有標識作用,所以常用頭指針冠以鏈表的名字 | 有了頭結點,對在第一元素結點前插入結點和刪除第一結點,其操作就統一了 |
無論鏈表是否為空,頭指針均不為空。頭指針是鏈表的必要元素 | 頭結點不一定是鏈表必須要素 |
單鏈表的插入和刪除 (算法復雜度 O(n))
對于插入或者刪除數據越頻繁的操作,單鏈表的效率優勢就越明顯;
插入
假設有結點 p, p 的下一個結點為 p->next, 需要將結點s插入到結點p之后;
算法思路: 將p的指向下個結點的指針地址更改為結點s的地址, 將結點s指向下個結點的指針地址更改為p->next的地址即可;
刪除
假設有連續的三個結點 p,q,r;現要刪除q;
算法思路:將p的存儲指針更改為r的指針地址;將q釋放;
單鏈表的整表創建
單鏈表的創建過程就是一個動態生成鏈表的過程,即從“空表”的初始狀態起依次建立各元素結點,并逐個插入鏈表;
- 頭插法:始終讓新結點在第一位置;
- 尾插法:每次把新結點都插在終端結點的后面;
單鏈表的整表刪除
算法思路
1、 聲明結點p,q;
2、 將第一個結點賦值給p;
3、 循環
* 將下一結點賦值給q;
* 釋放p;
* 將q賦值給p;
單鏈表結構和順序存儲結構優缺點
1、 存儲分配方式
- 順序存儲結構用一段連續的存儲單元依次存儲線性表的數據元素;
- 單鏈表采用鏈式存儲結構,用一組任意的存儲單元存放線性表的元素;
2、時間性能
- 查找
. 順序存儲結構O(1);
. 單鏈表O(n); - 插入和刪除
. 順序存儲結構需要平均移動表長一半的元素 時間為O(n);
. 單鏈表在線出某位置的指針后,插入和刪除的時間為O(1);
3、 空間性能
- 順序存儲結構需要預分配存儲空間,分大了,浪費,分小了易發生上溢;
- 單鏈表不需要分配存儲空間,只要有就可以分配,元素個數也不受限制;
4、 總結
- 若線性表需要頻繁的查找,很少進行插入和刪除操作時,宜采用順序存儲結構。若需要頻繁的插入個刪除的時,宜采用單鏈表結構。
- 當線性表中的元素個數變化較大或者根本不知道有多大時,最好用單鏈表結構,這樣不需要考慮存儲空間大小的問題。而如果事先知道線性表的大致長度,順序存儲效率較高;