日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

尹成 双循环链表

發布時間:2023/11/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 尹成 双循环链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? 今天,我們一起用C++寫一個雙鏈表,具體代碼如下:

DoubleList.h具體內容如下:

[cpp]?view plain?copy
  • #include?"NodeList.h"??
  • ??
  • template<typename?Type>?class?DoublyList{??
  • public:??
  • ????DoublyList()?:head(new?ListNode<Type>()){????//the?head?node?point?to?itself??
  • ????????head->m_pprior?=?head;??
  • ????????head->m_pnext?=?head;??
  • ????}??
  • ????~DoublyList(){??
  • ????????MakeEmpty();??
  • ????????delete?head;??
  • ????}??
  • ??
  • public:??
  • ????void?MakeEmpty();???//make?the?list?empty??
  • ????int?Length();???????//get?the?length?of?the?list??
  • ????ListNode<Type>?*Find(int?n?=?0);??//find?the?nth?data??
  • ????ListNode<Type>?*?FindData(Type?item);???//find?the?data?which?is?equal?to?item??
  • ????bool?Insert(Type?item,?int?n?=?0);?????//insert?item?in?the?nth?data??
  • ????Type?Remove(int?n?=?0);???//delete?the?nth?data??
  • ????Type?Get(int?n?=?0);??????//get?the?nth?data??
  • ????void?Print();???????????//print?the?list??
  • ??
  • 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++){???//find?the?position?for?insert??
  • ????????pmove?=?pmove->m_pnext;??
  • ????????if?(pmove?==?head){??
  • ????????????cout?<<?"The?n?is?out?of?boundary"?<<?endl;??
  • ????????????return?0;??
  • ????????}??
  • ????}??
  • ??
  • ????//insert?the?data??
  • ????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++){???//find?the?position?for?delete??
  • ????????pmove?=?pmove->m_pnext;??
  • ????????if?(pmove?==?head){??
  • ????????????cout?<<?"The?n?is?out?of?boundary"?<<?endl;??
  • ????????????exit(1);??
  • ????????}??
  • ????}??
  • ??
  • ????//delete?the?data??
  • ????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) {?//find?the?data?in?the?two?direction??
  • ????????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所示:

    總結

    以上是生活随笔為你收集整理的尹成 双循环链表的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。