<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
單向/雙向
單向:只有一個next指標,只指向下一位元素
雙向:有兩個指標,指向上一位和下一位元素,尋找前一節點和後一節點很便利
帶頭/不帶頭
帶頭:在本來的頭結點之前還有一個哨兵衛節點作為頭節點,它的址域指標指向頭節點,值域不做使用
不帶頭:沒有哨兵衛頭節點,在尾刪尾插等問題中要考慮頭結點的情況(侷限)
迴圈/非迴圈
迴圈:頭結點會與尾節點相連
非迴圈:頭結點不與尾節點相連
// 建立連結串列(連結串列初始化) ListNode* ListCreate(); //建立節點 ListNode* BuyListNode(ListNode* pHead); // 雙向連結串列銷燬 void ListDestory(ListNode* pHead); // 雙向連結串列列印 void ListPrint(ListNode* pHead); // 雙向連結串列尾插 void ListPushBack(ListNode* pHead, LTDataType x); // 雙向連結串列尾刪 void ListPopBack(ListNode* pHead); // 雙向連結串列頭插 void ListPushFront(ListNode* pHead, LTDataType x); // 雙向連結串列頭刪 void ListPopFront(ListNode* pHead); // 雙向連結串列查詢 ListNode* ListFind(ListNode* pHead, LTDataType x); // 雙向連結串列在pos的前面進行插入 void ListInsert(ListNode* pos, LTDataType x); // 雙向連結串列刪除pos位置的節點 void ListErase(ListNode* pos);
typedef int LTDataType; typedef struct ListNode { LTDataType data; struct ListNode* next; struct ListNode* prev; }ListNode;
// 建立連結串列(初始化) ListNode* ListCreate() { //開闢哨兵衛頭結點 ListNode* plist = (ListNode*)malloc(sizeof(ListNode)); if (plist == NULL)//失敗列印錯誤資訊並結束程序 { perror("ListCreat fail:"); exit(-1); } plist->next = plist; plist->prev = plist; return plist; }
//建立節點 ListNode* BuyListNode(LTDataType x) { //建立節點 ListNode* newnode = (ListNode*)malloc(sizeof(ListNode)); if (newnode == NULL)//失敗列印錯誤資訊並結束程序 { perror("creatnode fail:"); exit(-1); } newnode->data = x; //初始化結點 newnode->next = NULL; newnode->prev = NULL; return newnode; }
注:動態開闢的連結串列空間,在不使用後需要將之釋放,避免造成記憶體漏失
// 雙向連結串列銷燬 void ListDestory(ListNode* pHead) { //斷言傳入指標不為NULL assert(pHead); ListNode* cur = pHead; pHead->prev->next = NULL; while (cur!=NULL) { ListNode* next = cur->next; free(cur); cur = next; } return; }
// 雙向連結串列列印 void ListPrint(ListNode* pHead) { //斷言傳入指標不為NULL assert(pHead); //建立定址指標 ListNode* cur = pHead->next; //迴圈遍歷連結串列 while (cur != pHead) { //列印資料 printf("%d->", cur->data); //找到下一個節點 cur = cur->next; }printf("NULLn"); return; }
// 雙向連結串列尾插 void ListPushBack(ListNode* pHead, LTDataType x) { //斷言傳入指標不為NULL assert(pHead); //建立節點 ListNode* newnode = BuyListNode(x); //找到尾節點 ListNode* tail=pHead->prev; tail->next = newnode; newnode->prev = tail; pHead->prev = newnode; newnode->next = pHead; }
尾刪前記錄前一節點的地址
// 雙向連結串列尾刪 void ListPopBack(ListNode* pHead) { //斷言傳入指標不為NULL assert(pHead); //只剩哨兵衛頭結點的情況 if (pHead->prev == pHead) return; //記錄尾節點及其前一節點 ListNode* tail = pHead->prev; ListNode* tailprev = tail->prev; //釋放尾節點 free(tail); //構建尾節點前一節點與哨兵衛頭結點的關係 tailprev->next = pHead; pHead->prev = tailprev; return; }
頭插前記錄哨兵衛頭節點的下一節點
// 雙向連結串列頭插 void ListPushFront(ListNode* pHead, LTDataType x) { //斷言傳入指標不為NULL assert(pHead); //建立節點 ListNode* newnode = BuyListNode(x); //記錄哨兵衛頭結點的下一節點 ListNode* next = pHead->next; //構建各節點之間的關係 pHead->next = newnode; newnode->prev = pHead; newnode->next = next; next->prev = newnode; return; }
// 雙向連結串列頭刪 void ListPopFront(ListNode* pHead) { //斷言傳入指標不為NULL assert(pHead); //只剩哨兵衛頭結點的情況 if (pHead->next == pHead) return; //記錄哨兵衛頭結點下一節點及其的下一節點 ListNode* next = pHead->next; ListNode* nextNext = next->next; //釋放節點 free(next); pHead->next = nextNext; nextNext->prev = pHead; return; }
// 雙向連結串列查詢 ListNode* ListFind(ListNode* pHead, LTDataType x) { //斷言傳入指標不為NULL assert(pHead); //建立定址指標 ListNode* cur = pHead->next; while (cur != pHead) { //比較資料 if (cur->data == x) return cur; //找到下一個節點 cur = cur->next; } //沒找到則返回NULL return NULL; }
void ListErase(ListNode* pos) { assert(pos); ListNode* prev = pos->prev; ListNode* next = pos->next; free(pos); prev->next = next; next->prev = prev; return; }
我們在實帶頭雙向迴圈連結串列:結構最複雜,一般用在單獨儲存資料。實際中使用的連結串列資料結構,都是帶頭雙向迴圈連結串列。另外這個結構雖然結構複雜,但是使用程式碼實現以後會發現結構會帶來很多優勢,實現反而簡單現的時候可以看出其實帶頭雙向迴圈連結串列實現起來並不難,而且在雙向迴圈特點的加持下,在一些方面顯得格外方便。
但是因為帶頭雙向迴圈連結串列結構的複雜性,我們通常還是會使用邏輯結構相對簡單的單連結串列,並且在oj題上考的最多的也是單連結串列。
但我們仍要熟練掌握帶頭雙向迴圈連結串列的結構和實現方式,因為這是一種特別且方便的結構,且用處十分強大。
到此這篇關於C++零基礎精通資料結構之帶頭雙向迴圈連結串列的文章就介紹到這了,更多相關C++ 帶頭雙向迴圈連結串列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45