C++帶頭雙向循環(huán)鏈表超詳細(xì)解析
上期我們講完了無(wú)頭單向非循環(huán)鏈表,這期我們接著來(lái)講鏈表中結(jié)構(gòu)最復(fù)雜的帶頭雙向循環(huán)鏈表!
本期主要內(nèi)容:
?? 什么是帶頭雙向循環(huán)鏈表?
?? 帶頭雙向循環(huán)鏈表常用接口實(shí)現(xiàn)!
?? 順序表和鏈表的區(qū)別和聯(lián)系!
什么是帶頭雙向循環(huán)鏈表
什么是帶頭?雙向?循環(huán)?(帶頭雙向循環(huán)鏈表)
帶頭:代表鏈表存在一個(gè)哨兵位節(jié)點(diǎn),也就是頭節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)不存放任何的有效數(shù)據(jù)!
雙向:每個(gè)節(jié)點(diǎn)都有兩個(gè)指針,分別指向它的前一個(gè)節(jié)點(diǎn)和后一個(gè)節(jié)點(diǎn)!
循環(huán):最后一個(gè)節(jié)點(diǎn)next不再指向NULL指向的是哨兵位節(jié)點(diǎn),哨兵位節(jié)點(diǎn)prev指向的是最后一個(gè)節(jié)點(diǎn)!(如果是單項(xiàng)鏈表的話哨兵位不指向最后一個(gè)節(jié)點(diǎn)!)
帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲(chǔ)數(shù)據(jù)。實(shí)際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個(gè)結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實(shí)現(xiàn)以后會(huì)發(fā)現(xiàn)結(jié)構(gòu)會(huì)帶來(lái)很多優(yōu)勢(shì),實(shí)現(xiàn)反而簡(jiǎn)單了,后面我們代碼實(shí)現(xiàn)了就知道了!
帶頭雙向循環(huán)鏈表常用接口實(shí)現(xiàn)
?? 搭建帶頭雙向循環(huán)鏈表的結(jié)構(gòu)!
?? 帶頭雙向循環(huán)鏈表的初始化并創(chuàng)建新節(jié)點(diǎn)!
?? 頭部插入節(jié)點(diǎn)!
?? 尾部插入節(jié)點(diǎn)!
?? 頭部刪除節(jié)點(diǎn)!
?? 尾部刪除節(jié)點(diǎn)!
?? 在pos節(jié)點(diǎn)前插入節(jié)點(diǎn)!
我們首先要找到pos節(jié)點(diǎn)的地址!
ListNode* ListFind(ListNode* phead, LTDataType x) { assert(phead); ListNode* cur = phead->next; while (cur != phead) { if (cur->data == x) { return cur; } cur = cur->next; } return NULL; }
?? 刪除指定pos節(jié)點(diǎn)!
看了上面的那么多的圖解,相信刪除指定節(jié)點(diǎn)對(duì)你來(lái)說(shuō)也很簡(jiǎn)單吧!我就直接上代碼了!
void ListErase(ListNode* pos) { assert(pos); ListNode* prev = pos->prev; ListNode* next = pos->next; prev->next = next; next->prev = prev; free(pos); pos = NULL; }
?? 最后別忘記銷毀鏈表哦!
void ListDestory(ListNode* phead) { ListNode* cur = phead->next; while (cur != phead) { ListNode* next = cur->next; free(cur); cur = next; } free(phead); phead = NULL; }
其實(shí)很多小伙伴一看到數(shù)據(jù)結(jié)構(gòu)就頭疼,但是我想說(shuō),不要嫌畫圖麻煩,一定要多畫圖,這樣更有利于我們實(shí)現(xiàn)代碼,靠腦袋空想是想不出來(lái)的!
最后愛打籃球的程序猿想送小伙伴們一句話:天再高又怎樣,踮起腳尖就更接近陽(yáng)光!
gitee(碼云):Mercury. (zzwlwp) - Gitee.com
到此這篇關(guān)于C++帶頭雙向循環(huán)鏈表超詳細(xì)解析的文章就介紹到這了,更多相關(guān)C++ 帶頭雙向循環(huán)鏈表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言中#pragma?pack(1)的用法與注意點(diǎn)
#pragma用于指示編譯器完成一些特定的動(dòng)作,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中#pragma?pack(1)的用法與注意點(diǎn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02VSCode 搭建 Arm 遠(yuǎn)程調(diào)試環(huán)境的步驟詳解
這篇文章主要介紹了VSCode 搭建 Arm 遠(yuǎn)程調(diào)試環(huán)境的步驟詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04C語(yǔ)言求階乘之和的三種實(shí)現(xiàn)方法(先階乘再累加)
對(duì)于C/C++初學(xué)者來(lái)說(shuō),可能會(huì)經(jīng)常遇到如計(jì)算階乘等問題,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言求階乘之和的三種實(shí)現(xiàn)方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07