C語(yǔ)言實(shí)驗(yàn)之鏈表的建立

在上一篇文章中開(kāi)始了我對(duì)大一C語(yǔ)言實(shí)驗(yàn)的記錄,這篇文章將記錄該實(shí)驗(yàn)中技術(shù)棧最關(guān)鍵新手掌握起來(lái)最困難的一個(gè)部分——鏈表。

鏈表可謂讓很多初學(xué)者望而生畏。但循序漸進(jìn)不會(huì)感到吃力。

要學(xué)習(xí)鏈表首先要學(xué)習(xí)C語(yǔ)言指針、結(jié)構(gòu)體等內(nèi)容。關(guān)于我學(xué)習(xí)C語(yǔ)言對(duì)內(nèi)存地址的操作的記錄會(huì)另寫(xiě),此處不做贅述。鏈表分為單鏈表、雙鏈表、單向循環(huán)鏈表、雙向循環(huán)鏈表。鏈表顧名思義由一個(gè)個(gè)結(jié)點(diǎn)連接而成的一條鏈。


典型幾種鏈表

在我做實(shí)驗(yàn)時(shí)采用了最簡(jiǎn)單的單鏈表,其他更復(fù)雜的鏈表自然具備單鏈表的功能。


單鏈表

單鏈表呈現(xiàn)在代碼上就是結(jié)構(gòu)體的嵌套,結(jié)構(gòu)體包含的數(shù)據(jù)類型為一個(gè)外來(lái)結(jié)構(gòu)體變量data以儲(chǔ)存數(shù)據(jù)和自身結(jié)構(gòu)體指針pnext儲(chǔ)存下一結(jié)點(diǎn)的地址(尾結(jié)點(diǎn)該變量為NULL)。當(dāng)然在變量較少的時(shí)候外來(lái)結(jié)構(gòu)體變量data可以直接聲明為基本數(shù)據(jù)類型。

圖為我的card_service.h頭文件,里面包含了對(duì)鏈表的初始化及基本操作函數(shù)。對(duì)鏈表的操作大概包括新建鏈表、結(jié)點(diǎn)的插入和鏈表刪除釋放等。而結(jié)點(diǎn)的插入又可以分為頭插入、尾插入和中間插入。中間插入當(dāng)然不是指隨意插入,通常對(duì)結(jié)點(diǎn)的順序有要求時(shí)會(huì)選擇中間某一合適的位置插入。

card_service.h頭文件

圖中

CardList* Creat_Card_List();//新建鏈表操作

新建鏈表主要是通過(guò)開(kāi)辟一塊內(nèi)存空間用于存放鏈表的頭結(jié)點(diǎn),為后續(xù)信息結(jié)點(diǎn)的插入做準(zhǔn)備。

CardList* p;

p = (CardList*)malloc(sizeof(CardList));

if (p == NULL)

????printf("內(nèi)存申請(qǐng)失敗");

上述幾行代碼就是為鏈表的頭結(jié)點(diǎn)開(kāi)辟內(nèi)存空間。其中if語(yǔ)句是一種習(xí)慣性寫(xiě)法,刪除不影響編譯,只是為了程序的穩(wěn)定性,通常會(huì)加入該if語(yǔ)句防止內(nèi)存申請(qǐng)失敗后對(duì)空指針的操作導(dǎo)致程序崩潰。

鏈表的頭結(jié)點(diǎn)就類似數(shù)組下標(biāo)為0的那一位,既可以用于儲(chǔ)存數(shù)據(jù),也可以“閑置”備用或用于存放一些特殊的數(shù)據(jù)

根據(jù)個(gè)人習(xí)慣,我將頭結(jié)點(diǎn)也作為了存放信息的一個(gè)結(jié)點(diǎn)(第一次建鏈表,覺(jué)得以后還是空著舒服),利用簡(jiǎn)單的格式化輸入函數(shù)即可讀取新建卡的信息。

為了使新建鏈表的程序更加簡(jiǎn)明扼要,部分教程推薦將開(kāi)辟內(nèi)存后的一步——?jiǎng)?chuàng)建卡放入“插入卡函數(shù)”中,再讓新建鏈表函數(shù)調(diào)用它。


新建鏈表函數(shù)節(jié)選

上圖主要是對(duì)變量的聲明和初始化,雖然我在新建鏈表函數(shù)中看似已經(jīng)創(chuàng)建了卡,但我還是調(diào)用了InserCard()函數(shù),目的是讓鏈表的每一個(gè)結(jié)點(diǎn)都是由插入函數(shù)實(shí)現(xiàn),對(duì)我個(gè)人理解起來(lái)更加流暢罷了,純屬個(gè)人偏好。

那么按照我的思路,新建卡無(wú)非就是向鏈表插入了一個(gè)新節(jié)點(diǎn),只是這個(gè)新節(jié)點(diǎn)作為鏈表的頭。


InserCard()函數(shù)節(jié)選

該程序段明顯能看出插入函數(shù)的邏輯,if-else語(yǔ)句把插入新結(jié)點(diǎn)分為了兩種情況。

當(dāng)鏈表已存在時(shí),新節(jié)點(diǎn)將插入至鏈表尾部。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容