鏈?zhǔn)疥?duì)列及基本操作(C語(yǔ)言詳解)
鏈?zhǔn)疥?duì)列,簡(jiǎn)稱(chēng)"鏈隊(duì)列",即使用鏈表實(shí)現(xiàn)的隊(duì)列存儲(chǔ)結(jié)構(gòu)。
鏈?zhǔn)疥?duì)列的實(shí)現(xiàn)思想同順序隊(duì)列類(lèi)似,創(chuàng)建兩個(gè)指針(命名為 top 和 rear)分別指向鏈表中隊(duì)列的隊(duì)頭元素和隊(duì)尾元素,如圖?1 所示:

圖 1 所示為鏈?zhǔn)疥?duì)列的初始狀態(tài),此時(shí)隊(duì)列中沒(méi)有存儲(chǔ)任何數(shù)據(jù)元素,因此 top 和 rear 指針都同時(shí)指向頭節(jié)點(diǎn)。
在創(chuàng)建鏈?zhǔn)疥?duì)列時(shí),強(qiáng)烈建議初學(xué)者創(chuàng)建一個(gè)帶有頭節(jié)點(diǎn)的鏈表,這樣實(shí)現(xiàn)鏈?zhǔn)疥?duì)列會(huì)更簡(jiǎn)單。
由此,我們可以編寫(xiě)出創(chuàng)建鏈?zhǔn)疥?duì)列的 C 語(yǔ)言實(shí)現(xiàn)代碼為:
鏈?zhǔn)疥?duì)列數(shù)據(jù)入隊(duì)
鏈隊(duì)隊(duì)列中,當(dāng)有新的數(shù)據(jù)元素入隊(duì),只需進(jìn)行以下 3 步操作:
將該數(shù)據(jù)元素用節(jié)點(diǎn)包裹,例如新節(jié)點(diǎn)名稱(chēng)為 elem;
與 rear 指針指向的節(jié)點(diǎn)建立邏輯關(guān)系,即執(zhí)行 rear->next=elem;
最后移動(dòng) rear 指針指向該新節(jié)點(diǎn),即 rear=elem;
由此,新節(jié)點(diǎn)就入隊(duì)成功了。
例如,在圖 1 的基礎(chǔ)上,我們依次將?{1,2,3}
?依次入隊(duì),各個(gè)數(shù)據(jù)元素入隊(duì)的過(guò)程如圖 2 所示:

如圖 2 中,我們將鏈表的頭部作為隊(duì)列的隊(duì)頭,將鏈表的尾部作為隊(duì)列的隊(duì)尾。當(dāng)然,也可以反過(guò)來(lái),將鏈表的頭部(尾部)作為隊(duì)列的隊(duì)尾(隊(duì)頭),兩種存儲(chǔ)方式都可以。
數(shù)據(jù)元素入鏈?zhǔn)疥?duì)列的 C 語(yǔ)言實(shí)現(xiàn)代碼為:
鏈?zhǔn)疥?duì)列數(shù)據(jù)出隊(duì)
當(dāng)鏈?zhǔn)疥?duì)列中有元素需要出隊(duì)時(shí),按照 "先進(jìn)先出" 的原則,需要先將在它之前入隊(duì)的元素依次出隊(duì),然后該目標(biāo)元素才能出隊(duì)。
我們知道,隊(duì)列中的元素只能從隊(duì)頭出隊(duì)。在圖 2 中,隊(duì)列的隊(duì)頭位于鏈表的頭部。因此隊(duì)列中元素出隊(duì)的過(guò)程,其實(shí)是鏈表中摘除首元結(jié)點(diǎn)的過(guò)程,需要做以下 3 步操作:
通過(guò) top 指針直接找到隊(duì)頭節(jié)點(diǎn),創(chuàng)建一個(gè)新指針 p 指向此即將出隊(duì)的節(jié)點(diǎn);
將 top 所指結(jié)點(diǎn)的 next 指針,指向 p 結(jié)點(diǎn)的直接后繼結(jié)點(diǎn);
釋放節(jié)點(diǎn) p 占用的內(nèi)存空間;
例如,在圖 2b) 的基礎(chǔ)上,我們將元素 1 和 2 出隊(duì),則操作過(guò)程如圖 3 所示:

鏈?zhǔn)疥?duì)列中隊(duì)頭元素出隊(duì)的 C 語(yǔ)言實(shí)現(xiàn)代碼為:
注意,將隊(duì)頭元素做出隊(duì)操作時(shí),需提前判斷隊(duì)列中是否還有元素,如果沒(méi)有,要提示用戶無(wú)法做出隊(duì)操作,保證程序的健壯性。此外,程序中要判斷被摘除的目標(biāo)結(jié)點(diǎn)是否是 rear 隊(duì)頭隊(duì)尾,如果是的話,要及時(shí)更新 rear 指針的指向。
總結(jié)
通過(guò)學(xué)習(xí)鏈?zhǔn)疥?duì)列最基本的數(shù)據(jù)入隊(duì)和出隊(duì)操作,我們可以就實(shí)際問(wèn)題,對(duì)以上代碼做適當(dāng)?shù)男薷摹?br>
前面在學(xué)習(xí)順序隊(duì)列時(shí),由于順序表的局限性,我們?cè)陧樞蜿?duì)列中實(shí)現(xiàn)數(shù)據(jù)入隊(duì)和出隊(duì)的基礎(chǔ)上,又對(duì)實(shí)現(xiàn)代碼做了改進(jìn),令其能夠充分利用數(shù)組中的空間。鏈?zhǔn)疥?duì)列就不需要考慮空間利用的問(wèn)題,因?yàn)殒準(zhǔn)疥?duì)列本身就是實(shí)時(shí)申請(qǐng)空間。因此,這可以算作是鏈?zhǔn)疥?duì)列相比順序隊(duì)列的一個(gè)優(yōu)勢(shì)。
這里給出鏈?zhǔn)疥?duì)列入隊(duì)和出隊(duì)的完整 C 語(yǔ)言代碼為:
程序運(yùn)行結(jié)果為:
1 2 3 4
隊(duì)列為空