2017年計(jì)算機(jī)二級(jí)公共基礎(chǔ)輔導(dǎo)講義:線性鏈表

字號(hào):


    1.5 線性鏈表
    1、線性表順序存儲(chǔ)的缺點(diǎn):(1)插入或刪除的運(yùn)算效率很低。在順序存儲(chǔ)的線性表中,插入或刪除數(shù)據(jù)元素時(shí)需要移動(dòng)大量的數(shù)據(jù)元素;(2)線性表的順序存儲(chǔ)結(jié)構(gòu)下,線性表的存儲(chǔ)空間不便于擴(kuò)充;(3)線性表的順序存儲(chǔ)結(jié)構(gòu)不便于對(duì)存儲(chǔ)空間的動(dòng)態(tài)分配。
    2、線性鏈表:線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)稱為線性鏈表,是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接來實(shí)現(xiàn)的。因此,在鏈?zhǔn)酱鎯?chǔ)方式中,每個(gè)結(jié)點(diǎn)由兩部分組成:一部分用于存放數(shù)據(jù)元素的值,稱為數(shù)據(jù)域;另一部分用于存放指針,稱為指針域,用于指向該結(jié)點(diǎn)的前一個(gè)或后一個(gè)結(jié)點(diǎn)(即前件或后件),如下圖所示:
    線性鏈表分為單鏈表、雙向鏈表和循環(huán)鏈表三種類型。
    在單鏈表中,每一個(gè)結(jié)點(diǎn)只有一個(gè)指針域,由這個(gè)指針只能找到其后件結(jié)點(diǎn),而不能找到其前件結(jié)點(diǎn)。因此,在某些應(yīng)用中,對(duì)于線性鏈表中的每個(gè)結(jié)點(diǎn)設(shè)置兩個(gè)指針,一個(gè)稱為左指針,指向其前件結(jié)點(diǎn);另一個(gè)稱為右指針,指向其后件結(jié)點(diǎn),這種鏈表稱為雙向鏈表,如下圖所示:
    3、線性鏈表的基本運(yùn)算
    (1)在線性鏈表中包含指定元素的結(jié)點(diǎn)之前插入一個(gè)新元素。
    *:在線性鏈表中插入元素時(shí),不需要移動(dòng)數(shù)據(jù)元素,只需要修改相關(guān)結(jié)點(diǎn)指針即可,也不會(huì)出現(xiàn)“上溢(注釋1)”現(xiàn)象。
    (2)在線性鏈表中刪除包含指定元素的結(jié)點(diǎn)。
    *:在線性鏈表中刪除元素時(shí),也不需要移動(dòng)數(shù)據(jù)元素,只需要修改相關(guān)結(jié)點(diǎn)指針即可。
    (3)將兩個(gè)線性鏈表按要求合并成一個(gè)線性鏈表。
    (4)將一個(gè)線性鏈表按要求進(jìn)行分解。
    (5)逆轉(zhuǎn)線性鏈表。
    (6)復(fù)制線性鏈表。
    (7)線性鏈表的排序。
    (8)線性鏈表的查找。
    *:線性鏈表不能隨機(jī)存?。ㄗ⑨?)。
    4、循環(huán)鏈表及其基本運(yùn)算
    在線性鏈表中,其插入與刪除的運(yùn)算雖然比較方便,但還存在一個(gè)問題,在運(yùn)算過程中對(duì)于空表和對(duì)第一個(gè)結(jié)點(diǎn)的處理必須單獨(dú)考慮,使空表與非空表的運(yùn)算不統(tǒng)一。為了克服線性鏈表的這個(gè)缺點(diǎn),可以采用另一種鏈接方式,即循環(huán)鏈表。
    與前面所討論的線性鏈表相比,循環(huán)鏈表具有以下兩個(gè)特點(diǎn):1)在鏈表中增加了一個(gè)表頭結(jié)點(diǎn),其數(shù)據(jù)域?yàn)槿我饣蛘吒鶕?jù)需要來設(shè)置,指針域指向線性表的第一個(gè)元素的結(jié)點(diǎn),而循環(huán)鏈表的頭指針指向表頭結(jié)點(diǎn);2)循環(huán)鏈表中最后一個(gè)結(jié)點(diǎn)的指針域不是空,而是指向表頭結(jié)點(diǎn)。即在循環(huán)鏈表中,所有結(jié)點(diǎn)的指針構(gòu)成了一個(gè)環(huán)狀鏈。
    下圖a是一個(gè)非空的循環(huán)鏈表,圖b是一個(gè)空的循環(huán)鏈表:
    循環(huán)鏈表的優(yōu)點(diǎn)主要體現(xiàn)在兩個(gè)方面:一是在循環(huán)鏈表中,只要指出表中任何一個(gè)結(jié)點(diǎn)的位置,就可以從它出發(fā)訪問到表中其他所有的結(jié)點(diǎn),而線性單鏈表做不到這一點(diǎn);二是由于在循環(huán)鏈表中設(shè)置了一個(gè)表頭結(jié)點(diǎn),在任何情況下,循環(huán)鏈表中至少有一個(gè)結(jié)點(diǎn)存在,從而使空表與非空表的運(yùn)算統(tǒng)一。
    *:循環(huán)鏈表是在單鏈表的基礎(chǔ)上增加了一個(gè)表頭結(jié)點(diǎn),其插入和刪除運(yùn)算與單鏈表相同。但它可以從任一結(jié)點(diǎn)出發(fā)來訪問表中其他所有結(jié)點(diǎn),并實(shí)現(xiàn)空表與非空表的運(yùn)算的統(tǒng)一。
    注釋1:當(dāng)為一個(gè)線性表分配順序存儲(chǔ)結(jié)構(gòu)后,如果出現(xiàn)線性表的存儲(chǔ)空間已滿,但還需要插入新的元素時(shí),就會(huì)發(fā)生“上溢”現(xiàn)象。
    注釋2:在鏈表中,即使知道被訪問結(jié)點(diǎn)的序號(hào)i,也不能像順序表中那樣直接按序號(hào)i訪問結(jié)點(diǎn),而只能從鏈表的頭指針出發(fā),順著鏈域逐個(gè)結(jié)點(diǎn)往下搜索,直至搜索到第i個(gè)結(jié)點(diǎn)為止。因此,鏈表不是隨機(jī)存儲(chǔ)結(jié)構(gòu)。