生活随笔
收集整理的這篇文章主要介紹了
尹成 双循环链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 今天,我們一起用C++寫一個雙鏈表,具體代碼如下:
DoubleList.h具體內容如下:
[cpp]?view plain
?copy #include?"NodeList.h"?? ?? template<typename?Type>?class?DoublyList{?? public:?? ????DoublyList()?:head(new?ListNode<Type>()){?????? ????????head->m_pprior?=?head;?? ????????head->m_pnext?=?head;?? ????}?? ????~DoublyList(){?? ????????MakeEmpty();?? ????????delete?head;?? ????}?? ?? public:?? ????void?MakeEmpty();????? ????int?Length();????????? ????ListNode<Type>?*Find(int?n?=?0);???? ????ListNode<Type>?*?FindData(Type?item);????? ????bool?Insert(Type?item,?int?n?=?0);??????? ????Type?Remove(int?n?=?0);????? ????Type?Get(int?n?=?0);???????? ????void?Print();????????????? ?? private:?? ????ListNode<Type>?*head;?? };?? ?? template<typename?Type>?void?DoublyList<Type>::MakeEmpty(){?? ????ListNode<Type>?*pmove?=?head->m_pnext,?*pdel;?? ????while?(pmove?!=?head){?? ????????pdel?=?pmove;?? ????????pmove?=?pdel->m_pnext;?? ????????delete?pdel;?? ????}?? ????head->m_pnext?=?head;?? ????head->m_pprior?=?head;?? }?? ?? template<typename?Type>?int?DoublyList<Type>::Length(){?? ????ListNode<Type>?*pprior?=?head->m_pprior,?*pnext?=?head->m_pnext;?? ????int?count?=?0;?? ????while?(1){?? ????????if?(pprior->m_pnext?==?pnext){ ?// 避免偶數個元素情況 不能使用條件 if(pprior == head) break; ????????????break;?? ????????}?? ????????if?(pprior?==?pnext&&pprior?!=?head){ ?//避免偶數個元素 ????????????count++;?? ????????????break;?? ????????}?? ????????count?+=?2;?? ????????pprior?=?pprior->m_pprior;?? ????????pnext?=?pnext->m_pnext;?? ????}?? ????return?count;?? }?? ?? template<typename?Type>?ListNode<Type>*?DoublyList<Type>::Find(int?n?=?0){?? ????if?(n?<?0){?? ????????cout?<<?"The?n?is?out?of?boundary"?<<?endl;?? ????????return?NULL;?? ????}?? ????ListNode<Type>?*pmove?=?head->m_pnext;?? ????for?(int?i?=?0;?i?<?n;?i++){?? ????????pmove?=?pmove->m_pnext;?? ????????if?(pmove?==?head){?? ????????????cout?<<?"The?n?is?out?of?boundary"?<<?endl;?? ????????????return?NULL;?? ????????}?? ????}?? ????return?pmove;?? }?? ?? template<typename?Type>?bool?DoublyList<Type>::Insert(Type?item,?int?n){?? ????if?(n?<?0){?? ????????cout?<<?"The?n?is?out?of?boundary"?<<?endl;?? ????????return?0;?? ????}?? ????ListNode<Type>?*newnode?=?new?ListNode<Type>(item),?*pmove?=?head;?? ????if?(newnode?==?NULL){?? ????????cout?<<?"Application?Erorr!"?<<?endl;?? ????????exit(1);?? ????}?? ????for?(int?i?=?0;?i?<?n;?i++){????? ????????pmove?=?pmove->m_pnext;?? ????????if?(pmove?==?head){?? ????????????cout?<<?"The?n?is?out?of?boundary"?<<?endl;?? ????????????return?0;?? ????????}?? ????}?? ?? ?????? ????newnode->m_pnext?=?pmove->m_pnext;?? ????newnode->m_pprior?=?pmove;?? ????pmove->m_pnext?=?newnode;?? ????newnode->m_pnext->m_pprior?=?newnode;?? ????return?1;?? }?? ?? template<typename?Type>?Type?DoublyList<Type>::Remove(int?n?=?0){?? ????if?(n?<?0){?? ????????cout?<<?"The?n?is?out?of?boundary"?<<?endl;?? ????????exit(1);?? ????}?? ????ListNode<Type>?*pmove?=?head,?*pdel;?? ????for?(int?i?=?0;?i?<?n;?i++){????? ????????pmove?=?pmove->m_pnext;?? ????????if?(pmove?==?head){?? ????????????cout?<<?"The?n?is?out?of?boundary"?<<?endl;?? ????????????exit(1);?? ????????}?? ????}?? ?? ?????? ????pdel?=?pmove;?? ????pmove->m_pprior->m_pnext?=?pdel->m_pnext;?? ????pmove->m_pnext->m_pprior?=?pdel->m_pprior;?? ????Type?temp?=?pdel->m_data;?? ????delete?pdel;?? ????return?temp;?? }?? ?? template<typename?Type>?Type?DoublyList<Type>::Get(int?n?=?0){?? ????if?(n?<?0){?? ????????cout?<<?"The?n?is?out?of?boundary"?<<?endl;?? ????????exit(1);?? ????}?? ????ListNode<Type>?*pmove?=?head;?? ????for?(int?i?=?0;?i?<?n;?i++){?? ????????pmove?=?pmove->m_pnext;?? ????????if?(pmove?==?head){?? ????????????cout?<<?"The?n?is?out?of?boundary"?<<?endl;?? ????????????exit(1);?? ????????}?? ????}?? ????return?pmove->m_data;?? }?? ?? template<typename?Type>?void?DoublyList<Type>::Print(){?? ????ListNode<Type>?*pmove?=?head->m_pnext;?? ????cout?<<?"head";?? ????while?(pmove?!=?head){?? ????????cout?<<?"--->"?<<?pmove->m_data;?? ????????pmove?=?pmove->m_pnext;?? ????}?? ????cout?<<?"--->over"?<<?endl?<<?endl?<<?endl;?? ?? }?? ?? template<typename?Type>?ListNode<Type>*?DoublyList<Type>::FindData(Type?item){?? ????ListNode<Type>?*pprior?=?head->m_pprior,?*pnext?=?head->m_pnext;?? ????while?(pprior->m_pnext?!=?pnext?&&?pprior?!=?pnext) {??? ????????if?(pprior->m_data?==?item){?? ????????????return?pprior;?? ????????}?? ????????if?(pnext->m_data?==?item){?? ????????????return?pnext;?? ????????}?? ????????pprior?=?pprior->m_pprior;?? ????????pnext?=?pnext->m_pnext;?? ????}?? ????cout?<<?"can't?find?the?element"?<<?endl;?? ????return?NULL;?? }??
NodeList.h具體內容如下:
[cpp]?view plain
?copy template<typename?Type>?class?DoublyList;?? ?? template<typename?Type>?class?ListNode{?? private:?? ????friend?class?DoublyList?<?Type?>?;?? ????ListNode()?:m_pprior(NULL),?m_pnext(NULL){}?? ????ListNode(const?Type?item,?ListNode<Type>?*prior?=?NULL,?ListNode<Type>?*next?=?NULL)?? ????????:m_data(item),?m_pprior(prior),?m_pnext(next){}?? ????~ListNode(){?? ????????m_pprior?=?NULL;?? ????????m_pnext?=?NULL;?? ????}?? public:?? ????Type?GetData();?? private:?? ????Type?m_data;?? ????ListNode?*m_pprior;?? ????ListNode?*m_pnext;?? };?? ?? template<typename?Type>?Type?ListNode<Type>::GetData(){?? ????return?this->m_data;?? }??
main.cpp的內容如下:
[cpp]?view plain
?copy #include?<iostream>?? #include?"DoubleList.h"?? ?? using?namespace?std;?? ?? int?main()?? {?? ????DoublyList<int>?list;?? ????for?(int?i?=?0;?i?<?20;?i++){?? ????????list.Insert(i?*?3,?i);?? ????}?? ????cout?<<?"the?Length?of?the?list?is?"?<<?list.Length()?<<?endl;?? ????list.Print();?? ????for?(int?i?=?0;?i?<?5;?i++){?? ????????list.Insert(3,?i?*?3);?? ????}?? ????cout?<<?"the?Length?of?the?list?is?"?<<?list.Length()?<<?endl;?? ????list.Print();?? ?? ????list.Remove(5);?? ????cout?<<?"the?Length?of?the?list?is?"?<<?list.Length()?<<?endl;?? ????list.Print();?? ?? ????cout?<<?list.FindData(54)->GetData()?<<?endl;?? ?? ????cout?<<?"The?third?element?is?"?<<?list.Get(3)?<<?endl;?? ?? ????list.MakeEmpty();?? ????cout?<<?"the?Length?of?the?list?is?"?<<?list.Length()?<<?endl;?? ????list.Print();?? ?? ????cin.get();?? ????return?0;?? }??
運行效果如圖1所示:
總結
以上是生活随笔為你收集整理的尹成 双循环链表的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。