C++雙向循環(huán)列表用法實(shí)例
本文實(shí)例講述了C++雙向循環(huán)列表用法。分享給大家供大家參考。具體如下:
/* 雙向循環(huán)鏈表 */ #include <iostream> using namespace std; //結(jié)構(gòu)體構(gòu)造鏈表的指針域和數(shù)據(jù)域 struct ChainNode { int data; //節(jié)點(diǎn)數(shù)據(jù) ChainNode *left; //節(jié)點(diǎn)的前驅(qū)指針 ChainNode *right; //節(jié)點(diǎn)的后繼指針 }; ////////////創(chuàng)建n個(gè)雙向循環(huán)鏈表 并返回鏈表頭指針///////// ChainNode* CreateNode(int n) { ChainNode *head = NULL; //鏈表頭節(jié)點(diǎn) ChainNode *pCur=NULL,*pNew=NULL; //當(dāng)前節(jié)點(diǎn),新建節(jié)點(diǎn) //初始化頭結(jié)點(diǎn)的前驅(qū)和后繼節(jié)點(diǎn)都為NULL if (n<1) //沒(méi)有節(jié)點(diǎn) 返回頭節(jié)點(diǎn) { return head; } //創(chuàng)建頭節(jié)點(diǎn)并將器左右指針指向空 head = new ChainNode; head->left = NULL; head->right = NULL; head->data = 0; pCur = head; //為防止指針互指帶來(lái)的混亂,用pCur節(jié)點(diǎn)保存了頭節(jié)點(diǎn) 也表示當(dāng)前指針移動(dòng)到了頭指針 //創(chuàng)建n個(gè)節(jié)點(diǎn) 并連接成鏈表 for (int i=0; i<n; i++) { pNew = new ChainNode; //創(chuàng)建一個(gè)新節(jié)點(diǎn) cout<<"請(qǐng)輸入數(shù)據(jù):"; cin>>pNew->data; pCur->right = pNew; //頭指針的右指針指向新建節(jié)點(diǎn) pNew->left = pCur; //新建節(jié)點(diǎn)的左指針執(zhí)行頭節(jié)點(diǎn) pNew->right = NULL; //用于最后和頭指針進(jìn)行交換 pCur = pNew; //指針往下移動(dòng) } //最后將頭指針的左指針指向最后一個(gè)節(jié)點(diǎn), //最后一個(gè)節(jié)點(diǎn)的有指針指向頭指針,構(gòu)成循環(huán) head->left = pCur; pCur->right = head; return head; } //////////////輸出鏈表頭節(jié)點(diǎn)/////////////////////// void OutList(ChainNode *head) //參數(shù)為頭指針 從頭指針開(kāi)始 { cout<<"鏈表元素輸出如下:"<<endl; ChainNode *pCur = head->right; //重第一個(gè)節(jié)點(diǎn)開(kāi)始輸出 //沒(méi)有指向空節(jié)點(diǎn),則鏈表沒(méi)結(jié)束 輸出鏈表元素 while (pCur->right != head) { cout<<pCur->data<<" "; pCur = pCur->right; //當(dāng)前節(jié)點(diǎn)指向下一個(gè)節(jié)點(diǎn) 可以遍歷鏈表 } cout<<pCur->data<<endl; //輸入最后一個(gè)元素,它的右指針執(zhí)行head } ///////在雙向循環(huán)鏈表后添加n個(gè)節(jié)點(diǎn)////// ChainNode* AddNode(ChainNode* head, int n) { ChainNode *pNew,*pCur; //新添加節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn) pCur = head; //移動(dòng)到最節(jié)點(diǎn) while (pCur->right != head) { pCur = pCur->right; //當(dāng)前節(jié)點(diǎn)往下移動(dòng) 一直移到最后一個(gè)節(jié)點(diǎn) } //新添加n個(gè)節(jié)點(diǎn)并插入鏈表 for (int i=0; i<n; i++) { pNew = new ChainNode; cout<<"輸入要添加的節(jié)點(diǎn)元素:"; cin>>pNew->data; pCur->right = pNew; //頭指針的右指針指向新建節(jié)點(diǎn) pNew->left = pCur; //新建節(jié)點(diǎn)的左指針執(zhí)行頭節(jié)點(diǎn) pNew->right = NULL; //用于最后和頭指針進(jìn)行交換 pCur = pNew; //指針往下移動(dòng) } //最后將頭指針的左指針指向最后一個(gè)節(jié)點(diǎn), //最后一個(gè)節(jié)點(diǎn)的有指針指向頭指針,構(gòu)成循環(huán) head->left = pCur; pCur->right = head; return head; } /////在雙向循環(huán)鏈表中刪除一個(gè)節(jié)點(diǎn)/////// ChainNode* DeleteNode(ChainNode* head, unsigned num) //刪除第num個(gè)節(jié)點(diǎn) { ChainNode *pNew,*pCur,*temp; //新添加節(jié)點(diǎn)和當(dāng)前節(jié)點(diǎn) ,臨時(shí)交換節(jié)點(diǎn) pCur = head; int ncount = 0; //移動(dòng)到第num-1個(gè)節(jié)點(diǎn) while (1) { ncount++; pCur = pCur->right; //當(dāng)前節(jié)點(diǎn)往下移動(dòng) if (num == ncount) { break; //此時(shí)pCur還是指向了第num個(gè)節(jié)點(diǎn) } } //當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)的右指針 指向 當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn) //當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)的左指針 指向 當(dāng)前節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn) 構(gòu)成連接 //最后 刪除當(dāng)前節(jié)點(diǎn) (pCur->left)->right = pCur->right; (pCur->right)->left = pCur->left; delete pCur; return head; } int main() { int num; //創(chuàng)建num個(gè)節(jié)點(diǎn)并顯示 cout<<"輸入要?jiǎng)?chuàng)建的鏈表節(jié)點(diǎn)個(gè)數(shù):"; cin>>num; ChainNode *head = CreateNode(num); OutList(head); //往鏈表后添加n個(gè)節(jié)點(diǎn) int addnum; cout<<"輸入要添加的節(jié)點(diǎn)個(gè)數(shù):"; cin>>addnum; AddNode(head, addnum); OutList(head); //刪除鏈表的第del個(gè)元素 int del; cout<<"輸入要?jiǎng)h除的第幾個(gè)位置的節(jié)點(diǎn):"; cin>>del; DeleteNode (head, del); OutList(head); system("pause"); return 0; }
希望本文所述對(duì)大家的C++程序設(shè)計(jì)有所幫助。
上一篇:C++實(shí)現(xiàn)簡(jiǎn)單的學(xué)生管理系統(tǒng)
欄 目:C語(yǔ)言
下一篇:C++文件讀寫(xiě)代碼分享
本文標(biāo)題:C++雙向循環(huán)列表用法實(shí)例
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2988.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法