⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xhsx_linklist.h

📁 定义并实现带头结点的循环双向链表类
💻 H
字号:
#ifndef XHSX_LINKLIST_H
#define XHSX_LINKLIST_H

template <class T>
class LinList;
template <class T>
class DuLNode
{
	friend class LinList<T>;
	private:
		DuLNode<T> *next;
		DuLNode<T> *pre;
		T data;
	public:
		DuLNode(DuLNode<T> *ptrNext=NULL, DuLNode<T> *prior=NULL)
		{
			next=ptrNext;
			pre=prior;
		    data=NULL;
		}
		DuLNode(const T& item,DuLNode<T> *ptrNext=NULL,DuLNode<T> *prior=NULL)
		{
			data=item;
			next=ptrNext;
			pre=prior;
		}
		~DuLNode(void){}
};

//双链表的定义
template <class T>
class LinList
{
	private:
		DuLNode<T> *head;
		int size;
		DuLNode<T> *Index(int i);//定位
	public:
		LinList(void);
		~LinList(void);
		int Size(void) const;
		void Insert(const T& item,int i);//插入
		T Delete(int i);//删除
		T GetData(int i);//取数据元素
};

template <class T>
LinList<T>::LinList()
{
	head=new DuLNode<T>();
	head->next=head;
	head->pre=head;
	size=0;
}

template <class T>
LinList<T>::~LinList(void)
{
	DuLNode<T> *p,*q;
	p=head;//p指向第一个结点
	while(p->next!=head)
	{
		q=p;
		p=p->next;
		delete q;
	}
	size=0;
	head=NULL;
}

template <class T>
DuLNode<T> *LinList<T>::Index(int i)//定位
{
	if(i<-1||i>size-1)
	{
		cout<<"参数i越界!"<<endl;
		exit(0);
	}
	if(i==-1) return head;
	DuLNode<T> *p=head->next;
	int j=0;
	while(j<i)
	{
		p=p->next;
		j++;
	}
	return p;//返回第i个结点的指针
}

template <class T>
int LinList<T>::Size(void) const
{
	return size;
}

template <class T>
void LinList<T>::Insert(const T& item,int i)//插入
{
	if(i<0||i>size)
	{
		cout<<"参数i越界出错!"<<endl;
		exit(0);
	}
	DuLNode<T> *p=Index(i-1);//p为指向第i-1个结点的指针
	DuLNode<T> *q= new DuLNode<T>(item,p->next);
	q->pre=p;
	q->next=p->next;
	p->next->pre=q;
	p->next=q;
	size++;
}

template <class T>
T LinList<T>::Delete(int i)//删除
{
	if(size==0)
	{
		cout<<"The Double is empty!"<<endl;
		exit(0);
	}
	if(i<0||i>size-1)
	{
		cout<<"参数i越界出错"<<endl;
	exit(0);
	}
	DuLNode<T> *s, *p=Index(i-1);
	s=p->next;
	T x=s->data;
	p->next=(p->next)->next;
	(p->next)->pre=p;
	delete s;
	size--;
	return x;
}

template <class T>//取数据元素
T LinList<T>::GetData(int i)
{
	if(i<0||i>size-1)
	{
		cout<<"参数i越界出错"<<endl;
		exit(0);
	}
	DuLNode<T> *p=Index(i);
	return p->data;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -