3. 線性表
3.1 線性表(List): 零個(gè)或多個(gè)數(shù)據(jù)元素的有限序列
3.2 線性表的定義
若將線性表記為(a1, ... ,ai-1, ai, ai+1, ... , an), 則表中 ai-1 領(lǐng)先于 ai, ai, 領(lǐng)先于 ai+1, 稱(chēng)ai-1是ai的直接前驅(qū)元素, ai+1 是 ai 的直接后繼元素. 當(dāng) i=1, 2, ... , n-1 時(shí), ai 有且僅有一個(gè)直接后繼, 當(dāng) i=2, 3 , ... , n 時(shí), ai 有且僅有一個(gè)直接前綴.
線性元素的個(gè)數(shù) n (n>=0) 定義為線性表的長(zhǎng)度, 當(dāng) n = 0 時(shí), 稱(chēng)為空表
3.5 順序存儲(chǔ)結(jié)構(gòu)的插入與刪除
- 線性表的順序存儲(chǔ)結(jié)構(gòu), 在存, 讀 數(shù)據(jù)時(shí), 時(shí)間復(fù)雜度是 O[1]
- 插入, 刪除時(shí), 時(shí)間復(fù)雜度為 O[n]
線性表順序存儲(chǔ)結(jié)構(gòu)的優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):
- 無(wú)需為表示表中元素之間的邏輯關(guān)系而增加二外的存儲(chǔ)空間
- 可以快速的存取表中任一位置的元素
- 缺點(diǎn):
- 插入和刪除操作需要移動(dòng)大量的元素
- 當(dāng)線性表長(zhǎng)度變化較大時(shí), 難以確定存儲(chǔ)空間的容量
- 造成存儲(chǔ)空間的 "碎片"
鏈表
3.6 線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)
鏈?zhǔn)浇Y(jié)構(gòu)中, 除了要存儲(chǔ)數(shù)據(jù)元素信息外, 還要存儲(chǔ)它的后繼元素地址
為了表示每個(gè)元素ai與其直接后繼數(shù)據(jù)元素ai+1之間的邏輯關(guān)系, 對(duì)數(shù)據(jù)元素ai來(lái)說(shuō), 除了存儲(chǔ)本身的信息之外, 還需存儲(chǔ)一個(gè)指示其直接后繼的信息(即直接后繼的存儲(chǔ)位置). 我們把存儲(chǔ)元素信息的域稱(chēng)為數(shù)據(jù)域, 把存儲(chǔ)直接后繼位置的域稱(chēng)為指針域. 指針域中存儲(chǔ)的信息稱(chēng)為指針或者鏈. 這兩部分信息組成數(shù)據(jù)元素ai的存儲(chǔ)映像, 稱(chēng)為節(jié)點(diǎn)(Node)
n 個(gè)節(jié)點(diǎn)(ai的存儲(chǔ)映像)鏈接成一個(gè)鏈表, 即 為線性表(a1,a2,...an)的鏈?zhǔn)浇Y(jié)構(gòu), 因?yàn)榇随湵淼拿總€(gè)節(jié)點(diǎn)中只包含有一個(gè)指針域, 所以叫做單鏈表.
鏈表中第一個(gè)節(jié)點(diǎn)的存儲(chǔ)位置叫做頭指針, 最后一個(gè)節(jié)點(diǎn)為空(NULL 或者 ^)
單鏈表的第一個(gè)節(jié)點(diǎn)前附加一個(gè)節(jié)點(diǎn),稱(chēng)為頭節(jié)點(diǎn)(不是必須的). 不存儲(chǔ)任何信息, 指向第一個(gè)節(jié)點(diǎn).
3.7 單鏈表的讀取
工作指針后移, 一個(gè)一個(gè)順序讀取.
3.8 單鏈表的插入與刪除
插入與刪除的時(shí)間復(fù)雜度都是O[1], 對(duì)于插入和刪除數(shù)據(jù)越頻繁的操作, 單列表的效率優(yōu)勢(shì)就越是明顯
3.9 單鏈表的整表創(chuàng)建
- 頭插法:
- 尾插法:
3.10 單鏈表的整表刪除
將鏈表中的所有元素依次刪除
3.11 單鏈表結(jié)構(gòu)與順便存儲(chǔ)結(jié)構(gòu)優(yōu)缺點(diǎn)
存儲(chǔ)分配方式
- 順便存儲(chǔ)結(jié)構(gòu)用一段連續(xù)的存儲(chǔ)單元依次存儲(chǔ)線性表的數(shù)據(jù)元素
- 單鏈表采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),用一組任意的存儲(chǔ)單元存放線性表的元素
時(shí)間性能
- 查找:
- 順序存儲(chǔ)o(1)
- 單鏈表o(n)
- 插入和刪除
- 順序存儲(chǔ)結(jié)構(gòu)需要平均移動(dòng)表上一般的元素 時(shí)間為o(n)
- 單鏈表在得到某位置的指針后, 插入和刪除時(shí)間僅為o(1)
空間性能
- 順序存儲(chǔ)結(jié)構(gòu)需要預(yù)分配存儲(chǔ)空間, 分大了 浪費(fèi), 分小了, 容易發(fā)生上溢
- 單鏈表不需要分配存儲(chǔ)空間, 只要有就可以分配, 元素個(gè)數(shù)也不受限制
結(jié)論:
- 若線性表需要頻繁查找, 很少進(jìn)行插入和刪除操作時(shí), 宜采用順序存儲(chǔ)結(jié)構(gòu). 若需要頻繁插入和刪除時(shí), 宜采用單鏈表結(jié)構(gòu)
- 當(dāng)線性表中的元素個(gè)數(shù)變化較大或者根本不知道有多大時(shí), 最好用單鏈表結(jié)構(gòu). 這樣可以不需要考慮存儲(chǔ)空間的大小問(wèn)題. 而如果實(shí)現(xiàn)知道線性表的大致長(zhǎng)度,如一年12個(gè)月, 一周就是星期一至星期天共七天, 用順序存儲(chǔ)結(jié)構(gòu)效率會(huì)高很多
3.12 靜態(tài)鏈表
優(yōu)點(diǎn): 在插入和刪除操作時(shí), 只需要修改游標(biāo), 不需要移動(dòng)元素, 從而改進(jìn)了在順序存儲(chǔ)結(jié)構(gòu)中的插入和刪除操作需要移動(dòng)大量元素的缺點(diǎn)
缺點(diǎn): 沒(méi)有解決連續(xù)存儲(chǔ)分配帶來(lái)的表長(zhǎng)難以確定的問(wèn)題
失去了順序存儲(chǔ)結(jié)構(gòu)隨機(jī)存取的特性
3.13 循環(huán)鏈表
將單鏈表中終端節(jié)點(diǎn)的指針端由空指針改為指向頭節(jié)點(diǎn), 就使整個(gè)單鏈表形成一個(gè)環(huán), 這種頭尾相接的單鏈表稱(chēng)為單循環(huán)鏈表, 簡(jiǎn)稱(chēng)循環(huán)鏈表(circular linked list)
3.14 雙向鏈表
雙向列表插入, 要先完善插入元素的 next 和 prior 指向, 再完善其他的
3.15 總結(jié)
- 線性表
- 順序存儲(chǔ)結(jié)構(gòu)
- 鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)
- 單鏈表
- 靜態(tài)鏈表
- 循環(huán)鏈表
- 雙向鏈表