鏈表的建立、插入和刪除(一)

字號(hào):

數(shù)組作為存放同類數(shù)據(jù)的集合,給我們?cè)诔绦蛟O(shè)計(jì)時(shí)帶來(lái)很多的方便,增加了靈活性。但數(shù)組也同樣存在一些弊病。如數(shù)組的大小在定義時(shí)要事先規(guī)定,不能在程序中進(jìn)行調(diào)整,這樣一來(lái),在程序設(shè)計(jì)中針對(duì)不同問(wèn)題有時(shí)需要3 0個(gè)大小的數(shù)組,有時(shí)需要5 0個(gè)數(shù)組的大小,
    難于統(tǒng)一。我們只能夠根據(jù)可能的需求來(lái)定義數(shù)組,常常會(huì)造成一定存儲(chǔ)空間的浪費(fèi)。
    我們希望構(gòu)造動(dòng)態(tài)的數(shù)組,隨時(shí)可以調(diào)整數(shù)組的大小,以滿足不同問(wèn)題的需要。鏈表就是我們需要的動(dòng)態(tài)數(shù)組。它是在程序的執(zhí)行過(guò)程中根據(jù)需要有數(shù)據(jù)存儲(chǔ)就向系統(tǒng)要求申請(qǐng)存儲(chǔ)空間,決不構(gòu)成對(duì)存儲(chǔ)區(qū)的浪費(fèi)。
    鏈表是一種復(fù)雜的數(shù)據(jù)結(jié)構(gòu),其數(shù)據(jù)之間的相互關(guān)系使鏈表分成三種:?jiǎn)捂湵?、循環(huán)鏈表、雙向鏈表,下面將逐一介紹。
    7.4.1 單鏈表
    圖7 - 3是單鏈表的結(jié)構(gòu)。
    單鏈表有一個(gè)頭節(jié)點(diǎn)h e a d,指向鏈表在內(nèi)存的首地址。鏈表中的每一個(gè)節(jié)點(diǎn)的數(shù)據(jù)類型為結(jié)構(gòu)體類型,節(jié)點(diǎn)有兩個(gè)成員:整型成員(實(shí)際需要保存的數(shù)據(jù))和指向下一個(gè)結(jié)構(gòu)體類型節(jié)點(diǎn)的指針即下一個(gè)節(jié)點(diǎn)的地址(事實(shí)上,此單鏈表是用于存放整型數(shù)據(jù)的動(dòng)態(tài)數(shù)組)。鏈表按此結(jié)構(gòu)對(duì)各節(jié)點(diǎn)的訪問(wèn)需從鏈表的頭找起,后續(xù)節(jié)點(diǎn)的地址由當(dāng)前節(jié)點(diǎn)給出。無(wú)論在表中訪問(wèn)那一個(gè)節(jié)點(diǎn),都需要從鏈表的頭開(kāi)始,順序向后查找。鏈表的尾節(jié)點(diǎn)由于無(wú)后續(xù)節(jié)點(diǎn),其指針域?yàn)榭?,?xiě)作為N U L L。
    圖7 - 3還給出這樣一層含義,鏈表中的各節(jié)點(diǎn)在內(nèi)存的存儲(chǔ)地址不是連續(xù)的,其各節(jié)點(diǎn)的地址是在需要時(shí)向系統(tǒng)申請(qǐng)分配的,系統(tǒng)根據(jù)內(nèi)存的當(dāng)前情況,既可以連續(xù)分配地址,也可以跳躍式分配地址。
    看一下鏈表節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)定義:
    struct node
    {
    int num;
    struct node *p;
    } ;
    在鏈表節(jié)點(diǎn)的定義中,除一個(gè)整型的成員外,成員p是指向與節(jié)點(diǎn)類型完全相同的指針。
    在鏈表節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)中,非常特殊的一點(diǎn)就是結(jié)構(gòu)體內(nèi)的指針域的數(shù)據(jù)類型使用了未定義成功的數(shù)據(jù)類型。這是在C中規(guī)定可以先使用后定義的數(shù)據(jù)結(jié)構(gòu)。
    • 單鏈表的創(chuàng)建過(guò)程有以下幾步:
    1 ) 定義鏈表的數(shù)據(jù)結(jié)構(gòu)。
    2 ) 創(chuàng)建一個(gè)空表。
    3 ) 利用m a l l o c ( )函數(shù)向系統(tǒng)申請(qǐng)分配一個(gè)節(jié)點(diǎn)。
    4 ) 將新節(jié)點(diǎn)的指針成員賦值為空。若是空表,將新節(jié)點(diǎn)連接到表頭;若是非空表,將新
    節(jié)點(diǎn)接到表尾。
    5 ) 判斷一下是否有后續(xù)節(jié)點(diǎn)要接入鏈表,若有轉(zhuǎn)到3 ),否則結(jié)束。
    • 單鏈表的輸出過(guò)程有以下幾步
    1) 找到表頭。
    2) 若是非空表,輸出節(jié)點(diǎn)的值成員,是空表則退出。
    3 ) 跟蹤鏈表的增長(zhǎng),即找到下一個(gè)節(jié)點(diǎn)的地址。
    4) 轉(zhuǎn)到2 )。
    [例7-5] 創(chuàng)建一個(gè)存放正整數(shù)(輸入- 9 9 9做結(jié)束標(biāo)志)的單鏈表,并打印輸出。
    #include /包*含ma l l o c ( ) 的頭文件*/
    #include
    struct node /*鏈表節(jié)點(diǎn)的結(jié)構(gòu)* /
    {
    int num;
    struct node *next;
    } ;
    m a i n ( )
    {
    struct node *creat(); / *函數(shù)聲明* /
    void print();
    struct node *head; / * 定義頭指針* /
    head=NULL;/*建一個(gè)空表*/
    head=creat(head);/*創(chuàng)建單鏈表*/
    print(head);/*打印單鏈表*/
    }