C++雙向循環(huán)列表用法實例
更新時間:2015年07月14日 11:07:06 作者:G0561
這篇文章主要介紹了C++雙向循環(huán)列表,實例分析了C++雙向循環(huán)列表的創(chuàng)建、輸出、添加、刪除、移動的相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
本文實例講述了C++雙向循環(huán)列表用法。分享給大家供大家參考。具體如下:
/* 雙向循環(huán)鏈表 */ #include <iostream> using namespace std; //結(jié)構(gòu)體構(gòu)造鏈表的指針域和數(shù)據(jù)域 struct ChainNode { int data; //節(jié)點數(shù)據(jù) ChainNode *left; //節(jié)點的前驅(qū)指針 ChainNode *right; //節(jié)點的后繼指針 }; ////////////創(chuàng)建n個雙向循環(huán)鏈表 并返回鏈表頭指針///////// ChainNode* CreateNode(int n) { ChainNode *head = NULL; //鏈表頭節(jié)點 ChainNode *pCur=NULL,*pNew=NULL; //當(dāng)前節(jié)點,新建節(jié)點 //初始化頭結(jié)點的前驅(qū)和后繼節(jié)點都為NULL if (n<1) //沒有節(jié)點 返回頭節(jié)點 { return head; } //創(chuàng)建頭節(jié)點并將器左右指針指向空 head = new ChainNode; head->left = NULL; head->right = NULL; head->data = 0; pCur = head; //為防止指針互指帶來的混亂,用pCur節(jié)點保存了頭節(jié)點 也表示當(dāng)前指針移動到了頭指針 //創(chuàng)建n個節(jié)點 并連接成鏈表 for (int i=0; i<n; i++) { pNew = new ChainNode; //創(chuàng)建一個新節(jié)點 cout<<"請輸入數(shù)據(jù):"; cin>>pNew->data; pCur->right = pNew; //頭指針的右指針指向新建節(jié)點 pNew->left = pCur; //新建節(jié)點的左指針執(zhí)行頭節(jié)點 pNew->right = NULL; //用于最后和頭指針進行交換 pCur = pNew; //指針往下移動 } //最后將頭指針的左指針指向最后一個節(jié)點, //最后一個節(jié)點的有指針指向頭指針,構(gòu)成循環(huán) head->left = pCur; pCur->right = head; return head; } //////////////輸出鏈表頭節(jié)點/////////////////////// void OutList(ChainNode *head) //參數(shù)為頭指針 從頭指針開始 { cout<<"鏈表元素輸出如下:"<<endl; ChainNode *pCur = head->right; //重第一個節(jié)點開始輸出 //沒有指向空節(jié)點,則鏈表沒結(jié)束 輸出鏈表元素 while (pCur->right != head) { cout<<pCur->data<<" "; pCur = pCur->right; //當(dāng)前節(jié)點指向下一個節(jié)點 可以遍歷鏈表 } cout<<pCur->data<<endl; //輸入最后一個元素,它的右指針執(zhí)行head } ///////在雙向循環(huán)鏈表后添加n個節(jié)點////// ChainNode* AddNode(ChainNode* head, int n) { ChainNode *pNew,*pCur; //新添加節(jié)點和當(dāng)前節(jié)點 pCur = head; //移動到最節(jié)點 while (pCur->right != head) { pCur = pCur->right; //當(dāng)前節(jié)點往下移動 一直移到最后一個節(jié)點 } //新添加n個節(jié)點并插入鏈表 for (int i=0; i<n; i++) { pNew = new ChainNode; cout<<"輸入要添加的節(jié)點元素:"; cin>>pNew->data; pCur->right = pNew; //頭指針的右指針指向新建節(jié)點 pNew->left = pCur; //新建節(jié)點的左指針執(zhí)行頭節(jié)點 pNew->right = NULL; //用于最后和頭指針進行交換 pCur = pNew; //指針往下移動 } //最后將頭指針的左指針指向最后一個節(jié)點, //最后一個節(jié)點的有指針指向頭指針,構(gòu)成循環(huán) head->left = pCur; pCur->right = head; return head; } /////在雙向循環(huán)鏈表中刪除一個節(jié)點/////// ChainNode* DeleteNode(ChainNode* head, unsigned num) //刪除第num個節(jié)點 { ChainNode *pNew,*pCur,*temp; //新添加節(jié)點和當(dāng)前節(jié)點 ,臨時交換節(jié)點 pCur = head; int ncount = 0; //移動到第num-1個節(jié)點 while (1) { ncount++; pCur = pCur->right; //當(dāng)前節(jié)點往下移動 if (num == ncount) { break; //此時pCur還是指向了第num個節(jié)點 } } //當(dāng)前節(jié)點的前一個節(jié)點的右指針 指向 當(dāng)前節(jié)點的下一個節(jié)點 //當(dāng)前節(jié)點的下一個節(jié)點的左指針 指向 當(dāng)前節(jié)點的上一個節(jié)點 構(gòu)成連接 //最后 刪除當(dāng)前節(jié)點 (pCur->left)->right = pCur->right; (pCur->right)->left = pCur->left; delete pCur; return head; } int main() { int num; //創(chuàng)建num個節(jié)點并顯示 cout<<"輸入要創(chuàng)建的鏈表節(jié)點個數(shù):"; cin>>num; ChainNode *head = CreateNode(num); OutList(head); //往鏈表后添加n個節(jié)點 int addnum; cout<<"輸入要添加的節(jié)點個數(shù):"; cin>>addnum; AddNode(head, addnum); OutList(head); //刪除鏈表的第del個元素 int del; cout<<"輸入要刪除的第幾個位置的節(jié)點:"; cin>>del; DeleteNode (head, del); OutList(head); system("pause"); return 0; }
希望本文所述對大家的C++程序設(shè)計有所幫助。
相關(guān)文章
C++實現(xiàn)LeetCode(134.加油站問題)
這篇文章主要介紹了C++實現(xiàn)LeetCode(134.加油站問題),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07linux內(nèi)核select/poll,epoll實現(xiàn)與區(qū)別
這篇文章主要介紹了linux內(nèi)核select/poll,epoll實現(xiàn)與區(qū)別,需要的朋友可以參考下2016-11-11Qt?加載?libjpeg?庫出現(xiàn)“長跳轉(zhuǎn)已經(jīng)運行”錯誤問題解決
這篇文章主要介紹了Qt?加載?libjpeg?庫出現(xiàn)“長跳轉(zhuǎn)已經(jīng)運行”錯誤,本文給大家分享完美解決方案,需要的朋友可以參考下2023-04-04