雙向鏈表的實現

#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> &copy);
		SimpleDblLinkList<ElemType>& operator = (const SimpleDblLinkList<ElemType> &copy);
};

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> &copy)
{
	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> &copy)
{
	if(&copy=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;
}


發佈了445 篇原創文章 · 獲贊 27 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章