双向链表(C++)
下面是继续写的数据结构中双向链表的类(还有部分有些问题,待将所有的数据结构实现之后统一测试和修改)(记得未测试哦。)
//公元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 Empty int 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