下面是繼續寫的資料結構中雙向鏈表的類(還有部分有些問題,待將所有的資料結構實現之後統一測試和修改)(記得未測試哦。)
//公元2013年3月17日//Single List--By Paul#ifndef _DoubleList_#define _DoubleList_#include<iostream>using namespace std;template<typename Type> class DoubleList;//結點類template<typename Type> class ListNode{private: Type data; ListNode *Previous; ListNode *Next;private:friend class DoubleList<Type>;ListNode():Previous(NULL),Next(NULL){}ListNode(const Type item,ListNode<Type> *Pprevious=NULL,ListNode<Type> *Nnext=NULL):data(item),Prevoius(Pprevious),Next(Nnext){}~ListNode(){Previous=NULL;Next=NULL;}public:Type GetData();};template<typename Type> Type ListNode<Type>:: GetData(){return this.data;}//雙鏈表類template<typename Type> class DoubleList{private:ListNode<Type> *head;public:DoubleList():head(new ListNode<Type>()){head->Previous=head;head->Neat=head;}~DoubleList(){MakeEmaty();delete head;}public:void MakeEmpty(); // make the List Emptyint Length();ListNode<Type> *Find(int n=0); //尋找第n個數的值ListNode<Type> *FindData(Type item);bool Insert(Type item,int n=0); //插入Type Remove(int n=0);Type Get(int n=0);void Print();};//函數的實現template<typename Type> void DoubleList<Type>::MakeEmpty(){ListNode<Type> *pmove=head->Next;ListNode<Type> *pdel;while(pmove!=head){pdel=pmove;pmove=pdel->Next;delete pdel;}head->Next=head;head->Previous=head;}template<typename Type> int DoubleList<Type>::Length(){ListNode<Type> *Pprevious=head->Previous,*Nnext=head->Next;int count=0;while(1){if(Pprevious->Next==Nnext){break;}if(Pprevious==Nnext&&Pprevious!=head){count++;break;}count+=2;Pprevious=Pprevious->Previous;Nnext=Nnext->Next;}return count;}template<typename Type> ListNode<Type>* DoubleList<Type>::Find(int n=0){if(n<0){cout<<"需要尋找的數值不存在"<<endl;return NULL;}ListNode<Type> *pmove=head->Next;for(int i=0;i<n;i++){pmove=pmove->Next;if(pmove==head){cout<<"需要尋找的數值不存在"<<endl;return NULL;}}return pmove;}template<typename Type> bool DoubleList<Type>::Insert(Type item,int n){if(n<0){cout<<"你的實如不合法"<<endl;return 0;}ListNode<Type> *newnode=new ListNode<Type>(item),*pmove=head;if(newnode==NULL){cout<<"Application Error"<<endl;exit(1);}for(int i=0;i<n;i++){pmove=pmove->Next;if(pmove==head){cout<<"this is out of boundry"<<endl;return 0;}}//插入資料newnode->Next=pmove->Next;newnode->Previous=pmove;pmove->Next=newnode;newnode->Next->Previous=newnode;return 1;}template<typename Type> Type DoubleList<Type>::Remove(int n=0){if(n<0){cout<<"This n is out of boundry"<<endl;exit(1);}ListNode<Type> *pmove=head,*pdel;for(int i=0;i<n;i++){pmove=pmove->Next;if(pmove==head){cout<<"the n is out of boundry"<<endl;exit(1);}}//刪除資料pdel=pmove;pmove->Previous->Next=pdel->Next;pmove->Next->Previous=pdel->Previous;Type temp=pdel->data;delete pdel;return temp;}template<typename Type> Type DoubleList<Type>::Get(int n=0){if(n<0){cout<<"this n is out of boundry"<<endl;exit(1);}ListNode<Type> *pmove=head;for(int i=0;i<n;i++){pmove=pmove->Next;if(pmove==head){cout<<"the n is out of boundry"<<endl;exit(1);}}return pmove->data;}template<typename Type> void DoubleList<Type>::Print(){ListNode<Type> *pmove=head->Next;cout<<"head";while(pmove!=head){cout<<"----->"<<pmove->data;pmove=pmove->Next;}cout<<"----->over"<<endl<<endl;}template<typename Type> ListNode<Type>* DoubleList<Type>::FindData(Type item){ListNode<Type> *Pprevious=head->Previous,*Nnext=head->Next;while(Pprevious->Next!=Nnext&&Pprevious!=Nnext){if(Pprevious->data==item){return Pprevious;}if(Nnext->data==item){return Nnext;}Pprevious=Pprevious->Previous;Nnext=Nnext->Next;}cout<<"Can't find the elelment"<<endl;return NULL;}#endif