三.线性表
線性表(List):零個(gè)或者多個(gè)數(shù)據(jù)元素的有限序列
有且只有一個(gè)直接前驅(qū)元素,有且只有一個(gè)直接后繼
線性表元素的個(gè)數(shù)n(n>0)定義為線性表的長(zhǎng)度,當(dāng)n=0時(shí),稱為空表
在較復(fù)雜的線性表中,一個(gè)數(shù)據(jù)元素可以由若干個(gè)數(shù)據(jù)項(xiàng)組成
線性表的順序順序存儲(chǔ)結(jié)構(gòu):用一段地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)線性表的數(shù)據(jù)元素
一維數(shù)組來(lái)實(shí)現(xiàn)順序存儲(chǔ)結(jié)構(gòu).
數(shù)組的長(zhǎng)度和線性表的長(zhǎng)度的區(qū)別?
數(shù)組的長(zhǎng)度是存放線性表存儲(chǔ)空間的長(zhǎng)度,存儲(chǔ)分配后這個(gè)量一般是不變的.
線性表的長(zhǎng)度是線性表中數(shù)據(jù)元素的個(gè)數(shù),(插入/刪除)這個(gè)量是變化的
在任何時(shí)刻,線性表的長(zhǎng)度應(yīng)該小于等于數(shù)組的長(zhǎng)度
存儲(chǔ)器中的每個(gè)存儲(chǔ)單元都有自己的編號(hào),這個(gè)編號(hào)稱為地址
線性表順序存儲(chǔ)結(jié)構(gòu)的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):無(wú)需為表中元素之間的邏輯關(guān)系而增加額外的存儲(chǔ)空間,可以快速的存取表中的任一位置的元素
缺點(diǎn):插入和刪除時(shí)需要移動(dòng)表中大量的元素,當(dāng)線性表長(zhǎng)度變化較大時(shí),難以確定存儲(chǔ)空間的容量,造成存儲(chǔ)空間的碎片
線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu):為了表示每個(gè)數(shù)據(jù)元素ai和其直接后繼元素ai+1之間的邏輯關(guān)系,對(duì)數(shù)據(jù)元素ai來(lái)說(shuō),除了存儲(chǔ)其本身的信息之外,還需存儲(chǔ)一個(gè)指示其直接后繼的信息(即直接后繼的存儲(chǔ)位置).我們把存儲(chǔ)數(shù)據(jù)元素的信息的區(qū)域成為數(shù)據(jù)域,把直接存儲(chǔ)直接后繼位置的域稱為指針域.指針域中存儲(chǔ)的信息稱作指針或鏈.這兩部分信息組成數(shù)據(jù)元素ai的存儲(chǔ)映像,稱為結(jié)點(diǎn)(Node)
n個(gè)結(jié)點(diǎn)鏈接成一個(gè)鏈表,即為線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu).因?yàn)榇随湵淼拿總€(gè)結(jié)點(diǎn)中只包含一個(gè)指針域,所以叫做單鏈表
頭指針:鏈表中第一個(gè)結(jié)點(diǎn)的存儲(chǔ)位置
頭結(jié)點(diǎn):在單鏈表的第一個(gè)結(jié)點(diǎn)前附設(shè)一個(gè)結(jié)點(diǎn)(為了方便對(duì)鏈表操作)
區(qū)別?
頭指針是指鏈表指向第一個(gè)結(jié)點(diǎn)的指針,如果鏈表有頭結(jié)點(diǎn),則指向頭結(jié)點(diǎn)的指針
頭指針具有標(biāo)識(shí)作用,所以常以頭指針冠以鏈表的名字
無(wú)論鏈表是否為空,頭指針都不為空,頭指針是鏈表的必要元素
頭結(jié)點(diǎn)是為了操作的統(tǒng)一和方便而設(shè)立的,放在第一元素的結(jié)點(diǎn)之前,其數(shù)據(jù)域一般無(wú)意義(也可存放鏈表長(zhǎng)度)
有了頭結(jié)點(diǎn),對(duì)在第一個(gè)元素結(jié)點(diǎn)前插入結(jié)點(diǎn)和刪除第一結(jié)點(diǎn),其操作和其他結(jié)點(diǎn)的操作就統(tǒng)一了
頭結(jié)點(diǎn)不一定是鏈表必須要素
單鏈表和順序存儲(chǔ)結(jié)構(gòu)的區(qū)別:
存儲(chǔ)分配方式:
順序存儲(chǔ)結(jié)構(gòu)用一段連續(xù)的存儲(chǔ)單元依次存儲(chǔ)線性表的數(shù)據(jù)元素
單鏈表采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),用一組任意的存儲(chǔ)單元存放線性表的元素
時(shí)間性能:
查找:順序存儲(chǔ)結(jié)構(gòu)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ù)也不受限制
靜態(tài)鏈表:用數(shù)組描述的鏈表(游標(biāo)實(shí)現(xiàn)法)
循環(huán)鏈表:將單鏈表的終端節(jié)點(diǎn)的指針端由空指針改為指向頭結(jié)點(diǎn),就使整個(gè)單鏈表形成一個(gè)環(huán),這種頭尾相接的單鏈表稱為單循環(huán)鏈表,簡(jiǎn)稱循環(huán)鏈表
雙向鏈表:在單鏈表的每個(gè)結(jié)點(diǎn)中,再設(shè)置一個(gè)指向其前驅(qū)結(jié)點(diǎn)的指針域
總結(jié)