線性表(二)

1.什麼是線性表

線性表是0個或多個數據元素的有限序列。

線性表的操作:
InitList(*L) //初始化線性表 空表
ListEmpty(L) //判斷 線性表是否爲空 true/false
ClearList(*L) //清空線性表
GetElem(L,i,&e) //將線性表L 中第i個位置元素 返回給e
LocateElem(L,e) //查找e在線性表l中的位置 沒有的話返回0
ListInsert(*L,i,e) //在第i個位置插入e
ListDelete(*L,i,*e) // 刪除第i個位置的元素 並返回個e
ListLength(L) //返回線性表元素個數

順序存儲的定義
線性表的順序存儲結構,指的是用一段地址連續的存儲單元一次存儲線性表中的數據元素。
就是 java中的數組。

獲取元素的時間複雜度是 O(1)
LOC(ai-1) = LOC(ai) +C //C是一個數據元素佔用幾個存儲單元

第i個元素位置
LOC(ai) = LOC(a1)+(i-1)*c

順序存儲結構的優缺點
優點:
1.無需爲表中的元素之間的邏輯關係而添加額外的存儲位置。
2.快速查詢表中任意元素的位置。
缺點:
1.插入和刪除都需要移動大量的元素。
2.線性表長度變化大時,無法確定存儲空間容量 因爲需要一開始指定容量大小
3.容易造成存儲空間的碎片 。

鏈式存儲結構

每個節點都有一個前驅元素和後繼元素。
爲了表示每個節點與其後繼元素之間的邏輯關係 除了存儲元素本身的信息之外,還需要存儲指示其後繼元素地址的信息。

即將節點分爲了數據域和指針域
數據域存儲數據元素信息。
指針域存儲後繼元素的位置

鏈表有 以下幾種:
單鏈表 靜態鏈表 循環鏈表 雙向鏈表

以單鏈表爲例
單鏈表的新增元素

節點p -> 節點q

要在節點p和節點q 中插入一個 節點s

操作爲:

s->next = p->next
p->next = s

單鏈表 刪除節點
節點p -> 節點p next -> 節點p next next

要想刪除中間的 節點p next 則需要

p->next = p->next->next

鏈式存儲 中單鏈表的結構和 順序存儲結構之間的優缺點。

1.存儲
單鏈表中的內存分配 可以不連續
順序存儲 必須是連續的存儲單元
2.時間複雜度
單鏈表中查詢一個元素的複雜度爲O(n)
順序存儲查詢僅爲O(1)
單鏈表新增和刪除的複雜度爲O(1)
順序存儲新增和刪除需要O(n)
3.空間性能
順序空間存儲需要預分配空間 確定長度 擴容麻煩
鏈式存儲不需要分配 元素個數不受限制。

靜態鏈表、循環鏈表
用數組描述的鏈表 叫做靜態鏈表 即 兩個數據域 一個存數據 另一個存下一個數據元素的下表 循環鏈表即將最後節點指向頭結點 這裏不做贅述。

雙向鏈表
即節點除了擁有數據域和next之外 還能指向前驅元素的位置
擁有 data 、prisor、next
p->next 指向下一個數據元素位置 p-prisor 指向上一個數據元素位置

雙向鏈表的插入

節點p -> 節點p next

要在節點p 和 節點p-next 插入 節點s
需要四步
1.確定s的後繼指針
2.確定s的前驅指針
3.修改p next的前驅指針指向s
4.修改p 的後繼指針指向s

詳細操作爲:

s->next = p->next
s-prisor = p
p-next-prisor = s 
p-next = s

雙向鏈表的刪除

p的前驅元素(A) p p的後繼元素 (B)

要想刪除p 需要
將p的前驅元素的後繼指針指向p的後繼元素 ====A的後繼指針指向B
將p的後繼元度的前驅指針指向p的前驅元素 =====B的前驅指針指向A

詳細操作爲:

p->prisor->next = p->next 
p->next->prisor = p->prisor
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章