#ifndef _SIMPLEDBLLINKLIST_H_
#define _SIMPLEDBLLINKLIST_H_
#include <iostream>
#include "NodeDbl.h"
using namespace std;
enum StatusCode{SUCCESS,RANGE_ERROR};
template<class ElemType>
class SimpleDblLinkList
{
protected:
NodeDbl<ElemType> *head;
NodeDbl<ElemType>* GetElemPtr(int position)const;
void Init();
public:
SimpleDblLinkList();
~SimpleDblLinkList();
void Clear();
int Length()const;
bool Empty()const;
void Traverse(void(* visit)(ElemType &e))const;
StatusCode GetElem(int position,ElemType &e)const;
StatusCode SetElem(int position,const ElemType &e);
StatusCode Insert(int position,const ElemType &e);
StatusCode Delete(int position,ElemType &e);
SimpleDblLinkList(const SimpleDblLinkList<ElemType> ©);
SimpleDblLinkList<ElemType>& operator = (const SimpleDblLinkList<ElemType> ©);
};
template<class ElemType>
SimpleDblLinkList<ElemType>::SimpleDblLinkList()
{
Init();
}
template<class ElemType>
void SimpleDblLinkList<ElemType>::Init()
{
head=new NodeDbl<ElemType>;
head->back=head;
head->next=head;
}
template<class ElemType>
SimpleDblLinkList<ElemType>::~SimpleDblLinkList()
{
Clear();
delete head;
}
template<class ElemType>
void SimpleDblLinkList<ElemType>::Clear()
{
ElemType Elem;
while(Length()>0)
Delete(1,Elem);
}
template<class ElemType>
int SimpleDblLinkList<ElemType>::Length()const
{
int count=0;
for(NodeDbl<ElemType> *ptr=head->next;ptr!=head;ptr=ptr->next)
count++;
return count;
}
template<class ElemType>
bool SimpleDblLinkList<ElemType>::Empty()const
{
return head->next==head;
}
template<class ElemType>
void SimpleDblLinkList<ElemType>::Traverse(void(* visit)(ElemType &e))const
{
for(NodeDbl<ElemType> *ptr=head->next;ptr!=head;ptr=ptr->next)
(* visit)(ptr->data);
}
template<class ElemType>
NodeDbl<ElemType>* SimpleDblLinkList<ElemType>::GetElemPtr(int position)const
{
if(position<0||position>Length())
return NULL;
for(NodeDbl<ElemType> *ptr=head;position>0;ptr=ptr->next,--position)
;
return ptr;
}
template<class ElemType>
StatusCode SimpleDblLinkList<ElemType>::GetElem(int position,ElemType &e)const
{
if(position<1||position>Length())
return RANGE_ERROR;
else
{
e=GetElemPtr(position)->data;
return SUCCESS;
}
}
template<class ElemType>
StatusCode SimpleDblLinkList<ElemType>::SetElem(int position,const ElemType &e)
{
if(position<1||position>Length())
return RANGE_ERROR;
else
{
NodeDbl<ElemType> *ptr->data=e;
return SUCCESS;
}
}
template<class ElemType>
StatusCode SimpleDblLinkList<ElemType>::Insert(int position,const ElemType &e)
{
if(position<1||position>Length()+1)
return RANGE_ERROR;
else
{
NodeDbl<ElemType> *ptr=GetElemPtr(position-1);
NodeDbl<ElemType> *ptrNext=ptr->next;
NodeDbl<ElemType> *ptrNew=new NodeDbl<ElemType>(e,ptr,ptrNext);
ptrNew->data=e;
ptr->next=ptrNew;
ptrNext->back=ptrNew;
return SUCCESS;
}
}
template<class ElemType>
StatusCode SimpleDblLinkList<ElemType>::Delete(int position,ElemType &e)
{
if(position<1||position>Length())
return RANGE_ERROR;
else
{
NodeDbl<ElemType> *ptr=GetElemPtr(position);
ptr->back->next=ptr->next;
ptr->next->back=ptr->back;
e=ptr->data;
delete ptr;
return SUCCESS;
}
}
template<class ElemType>
SimpleDblLinkList<ElemType>::SimpleDblLinkList(const SimpleDblLinkList<ElemType> ©)
{
Init();
NodeDbl<ElemType> *ptr;
for(NodeDbl<ElemType> *ptrCopy=head->next;ptrCopy!=head;ptrCopy=ptrCopy->next)
{
ptr=new NodeDbl<ElemType>(ptrCopy->data,ptrCopy->back,ptrCopy->next);
}
}
template<class ElemType>
SimpleDblLinkList<ElemType>& SimpleDblLinkList<ElemType>::operator = (const SimpleDblLinkList<ElemType> ©)
{
if(©=this)
{
Init();
NodeDbl<ElemType> *ptr;
for(NodeDbl<ElemType> *ptrCopy=head->next;ptrCopy!=head;ptrCopy=ptrCopy->next)
{
ptr=new NodeDbl<ElemType>(ptrCopy->data,ptrCopy->back,ptrCopy->next);
}
}
return *this;
}
#endif
#ifndef _NODEDBL_H_
#define _NODEDBL_H_
#include <iostream>
using namespace std;
template<class ElemType>
class NodeDbl
{
public:
NodeDbl<ElemType> *back;
NodeDbl<ElemType> *next;
ElemType data;
NodeDbl();
NodeDbl(ElemType e,NodeDbl<ElemType> *linkBack=NULL,NodeDbl<ElemType> *linkNext=NULL);
};
template<class ElemType>
NodeDbl<ElemType>::NodeDbl()
{
next=NULL;
}
template<class ElemType>
NodeDbl<ElemType>::NodeDbl(ElemType e,NodeDbl<ElemType> *linkBack,NodeDbl<ElemType> *linkNext)
{
data=e;
back=linkBack;
next=linkNext;
}
#endif
#include "NodeDbl.h"
#include "SimpleDblLinkList.h"
#include <iostream>
using namespace std;
void main()
{
SimpleDblLinkList<int> la;
la.Insert(1,1);
la.Insert(2,5);
int a;
la.GetElem(1,a);
la.GetElem(2,a);
la.Delete(1,a);
cout<<a<<endl;
}