C++超詳細(xì)分析單鏈表的實(shí)現(xiàn)與常見(jiàn)接口
相信如果看完了上期順序表的小伙伴應(yīng)該發(fā)現(xiàn)了順序表的諸多缺點(diǎn):
?? 中間/頭部的插入刪除,時(shí)間復(fù)雜度為O(N)!
?? 增容需要申請(qǐng)新的空間,拷貝數(shù)據(jù),釋放舊空間,會(huì)有不少的消耗。
?? 增容一般是呈倍增長(zhǎng),勢(shì)必會(huì)有一定的空間浪費(fèi)。
鏈表的OJ題會(huì)單獨(dú)出一期的哦!
那么,如何解決以上的問(wèn)題呢?
?? 那么什么是鏈表呢?—— 鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)的 。

?實(shí)際中要實(shí)現(xiàn)的鏈表的結(jié)構(gòu)非常多樣,以下情況組合起來(lái)就有8種鏈表結(jié)構(gòu):
1. 單向、雙向? ? ? ? ?2. 帶頭、不帶頭? ? ? ? ? ? 3. 循環(huán)、非循環(huán)
我們只講最簡(jiǎn)單和最復(fù)雜的,畢竟一句老話,冬天到了春天還會(huì)遠(yuǎn)嗎???
今天我們講無(wú)頭單向非循環(huán)鏈表,下期講帶頭雙向循環(huán)鏈表 !
好的,有了上面的認(rèn)識(shí)正式進(jìn)入我們本期的學(xué)習(xí)??。
無(wú)頭單向非循環(huán)鏈表:結(jié)構(gòu)簡(jiǎn)單,一般不會(huì)單獨(dú)用來(lái)存數(shù)據(jù)。實(shí)際中更多是作為其他數(shù)據(jù)結(jié) 構(gòu)的子結(jié)構(gòu),如哈希桶、圖的鄰接表等等。另外這種結(jié)構(gòu)在筆試面試中出現(xiàn)很多。
?我們來(lái)看到單鏈表的架構(gòu):

??? 單鏈表和順序表不一樣,我們是需要的時(shí)候動(dòng)態(tài)申請(qǐng)一個(gè)節(jié)點(diǎn)空間就夠了!
SLTNode* BuySListNode(SLTDataType x)
{
SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
if (newnode == NULL)
return NULL;//做空指針判斷
newnode->data = x;
newnode->next = NULL;
return newnode;
}
這里我們利用malloc函數(shù)開(kāi)辟了一個(gè)SLTNode大小的空間(得用SLTNode* 來(lái)接收),malloc和realloc一樣如果開(kāi)辟失敗會(huì)返回空指針,所以這我們需要先做判斷!不為空則把數(shù)據(jù)放入data,并且把指向下一個(gè)節(jié)點(diǎn)的 next 置空!并且返回新節(jié)點(diǎn)的地址!(這里如果不明白則需要補(bǔ)充結(jié)構(gòu)體,指針,動(dòng)態(tài)內(nèi)存開(kāi)辟的知識(shí))
?? 首先我們還是來(lái)實(shí)現(xiàn)單鏈表的頭部插入數(shù)據(jù)!

這里我們可以看到,不帶哨兵位(帶頭鏈表)鏈表需要改變頭指針位置,下期我們學(xué)帶頭雙向循環(huán)鏈表就可以不用雙指針了!
?? 下面是我們的單鏈表尾部插入數(shù)據(jù)!

?? 接著來(lái)實(shí)現(xiàn)單鏈表頭部刪除數(shù)據(jù)!

??? 下面來(lái)到單鏈表的尾部刪除數(shù)據(jù)!

?? 在指定元素前插入節(jié)點(diǎn)!
?這個(gè)我們首先需要找到指定節(jié)點(diǎn)元素的地址!

?接下來(lái)就是實(shí)現(xiàn)我們的指定元素前插入節(jié)點(diǎn)的函數(shù)了!

同理我們接著來(lái)實(shí)現(xiàn)刪除指定元素的節(jié)點(diǎn)!

最后其實(shí)還有一個(gè)修改節(jié)點(diǎn)數(shù)據(jù),這個(gè)看了上期的順序表實(shí)現(xiàn)起來(lái)就很簡(jiǎn)單,留給你們自己研究去啦!學(xué)好編程多想,多敲代碼準(zhǔn)沒(méi)錯(cuò)!?
????????那么以上這就是我們無(wú)頭單向非循環(huán)鏈表的常見(jiàn)接口了,如果你看完感覺(jué)比較吃力看不懂的話,建議多去回顧下c語(yǔ)言指針,結(jié)構(gòu)體,動(dòng)態(tài)內(nèi)存這幾張的內(nèi)容!當(dāng)你能把這個(gè)單鏈表理解透徹了,下一期的帶頭雙向循環(huán)鏈表也很容易理解的,代碼實(shí)現(xiàn)起來(lái)更輕松,加油吧!
最后還是那句話??我們一起快樂(lè)編程不頭禿!
gitee(碼云):Mercury. (zzwlwp) - Gitee.com??
到此這篇關(guān)于C++超詳細(xì)分析單鏈表的實(shí)現(xiàn)與常見(jiàn)接口的文章就介紹到這了,更多相關(guān)C++ 單鏈表的實(shí)現(xiàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt中QStackedWidget控件的實(shí)現(xiàn)
QStackedWidget是Qt框架中一個(gè)非常有用的控件,它允許你堆疊多個(gè)窗口部件,本文主要介紹了Qt中QStackedWidget控件的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2025-04-04
C++ 解引用與函數(shù)基礎(chǔ)詳解之內(nèi)存地址、調(diào)用方法及聲明
函數(shù)是C++ 中重要的編程概念,它們可以提高代碼的可重用性、可讀性和可維護(hù)性,本文介紹C++ 解引用與函數(shù)基礎(chǔ)詳解之內(nèi)存地址、調(diào)用方法及聲明,感興趣的朋友跟隨小編一起看看吧2024-04-04
C++類的自動(dòng)轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換的實(shí)現(xiàn)示例
類的自動(dòng)轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換是面向?qū)ο缶幊讨刑幚眍愋椭g轉(zhuǎn)換的兩種重要機(jī)制,本文就來(lái)介紹一下這兩種方法的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
C++11右值引用和移動(dòng)語(yǔ)義的實(shí)例解析
左值和右值都是針對(duì)表達(dá)式,左值是指表達(dá)式結(jié)束后依然存在的持久對(duì)象,右值是指表達(dá)式結(jié)束時(shí)就不再存在的臨時(shí)對(duì)象,下面這篇文章主要給大家介紹了關(guān)于C++11右值引用和移動(dòng)語(yǔ)義的相關(guān)資料,需要的朋友可以參考下2022-09-09
c語(yǔ)言中g(shù)etch,getche,getchar的區(qū)別

