数据结构(C++)——双循环链表

本文介绍了C++中实现的双循环链表类`DbList`,包括构造、析构、插入、删除、排序、反转等操作。提供了完整的代码实现,并通过`main`函数展示了如何使用这些操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include"AllHead.h"
template<class T>
class DbList;

template<class T>
class DbListNode
{
	template<class T>
	friend class DbList;
private:
	DbListNode<T> *pre;
	DbListNode<T> *next;
	T data;
public:
	DbListNode(DbListNode<T> *pt = NULL,DbListNode<T> *nt = NULL)
	{
		pre = pt;
		next = nt;
	}
	DbListNode(T x,DbListNode<T> *pt = NULL,DbListNode<T> *nt = NULL)
	{
		data = x;
		pre = pt;
		next = nt;
	}
};

template<class T>
class DbList
{
private:
	DbListNode<T> *begin;
	DbListNode<T> *end;
	size_t        size;
public:
	DbList()
	{
		begin = new DbListNode<T>;
		end = begin;
		begin->pre = end;
		end->next = begin;
		size = 0;
	}
	~DbList(){makeEmpty();}
	Status push_back(T x);
	Status push_front(T x);
	T getHead();
	T getLast();
	void show_dblist();
	size_t getLenth(){return size;}
	void makeEmpty();
	Status IsEmpty(){return begin == end?TRUE:FALSE;}
	Status pop_back();
	Status pop_front();
	Status insert_val(T x);
	Status del_val(T x);
	void sort();
	void reverse();
};
template<class T>
void DbList<T>::reverse()
{

	DbListNode<T> *p = begin->next->next;
	DbListNode<T> *h;
	begin->next->next = begin;
	begin->pre = begin->next;
	end = begin->next;
	h = p->next;
	while(p!=begin)
	{
		p->next = begin->next;
		p->pre = begin;
		begin->next->pre = p;
		begin->next = p;
		p = h;
		h = h->next;
	}
}
template<class T>
void DbList<T>::sort()
{
	if(IsEmpty())
	{
		cout<<"链表为空(sort)..."<<endl;
	}
	else
	{
		//p和m是断开后面的两个指针
		DbListNode<T> *p = begin->next;//p在后
		DbListNode<T> *m;              //m在前
		p->pre->next = begin;
		begin->pre = p->pre;
		end = begin;
		//h是新的链表这边的指针
		DbListNode<T> *h;
		while(p!=begin)
		{
			m = p;
			p = p->next;
			h = begin->next;
			while(h!=begin && m->data>h->data)
			{
				h = h->next;
			}
			if(h == begin)
			{
				end = m;
			}
			m->next = h;
			m->pre = h->pre;
			h->pre->next = m;
			h->pre = m;			
		}
	}
}

template<class T>
Status DbList<T>::del_val(T x)
{
	DbListNode<T> *p = begin->next;
	while(p!=begin&&p->data!=x)
	{
		p = p->next;
	}
	if(p == begin)
	{
		cout<<"该值不存在..."<<endl;
		return ERROR;
	}
	if(p == end)
	{
		end = p->pre;
	}
	p->pre->next = p->next;
	p->next->pre = p->pre;
	delete p;
	--size;
	return OK;
}
template<class T>
Status DbList<T>::insert_val(T x)
{
	DbListNode<T> *s = new DbListNode<T>;
	s->data = x;
	s->next = NULL;
	s->pre = NULL;
	DbListNode<T> *p = begin->next;
	while(p!=begin && p->data<x)
	{
		p = p->next;
	}
	if(p == begin)
	{
		end = s;
	}
	s->next = p;
	s->pre = p->pre;
	s->pre->next = s;
	p->pre = s;
	++size;
	return OK;
}
template<class T>
Status DbList<T>::pop_front()
{
	if(IsEmpty())
	{
		cout<<"链表已空(pop_front)..."<<endl;
		return ERROR;
	}
	DbListNode<T> *p = begin->next;
	begin->next = p->next;
	p->next->pre = begin;
	delete p;
	--size;
	if(size == 0)
	{
		end = begin;
	}
	return OK;
}
template<class T>
Status DbList<T>::pop_back()
{
	if(IsEmpty())
	{
		cout<<"链表已空(pop_back)..."<<endl;
		return ERROR;
	}
	end->pre->next = begin;
	begin->pre = end->pre;
	delete end;
	end = begin->pre;
	--size;
	return OK;
}
template<class T>
T DbList<T>::getLast()
{
	if(begin == end)
	{
		cout<<"空链表无尾..."<<endl;
		return NULL;
	}
	return end->data;
}
template<class T>
void DbList<T>::show_dblist()
{
	DbListNode<T> *p = begin->next;
	while(p!=begin)
	{
		cout<<p->data<<"==>";
		p = p->next;
	}
	cout<<"NULL"<<endl;
}
template<class T>
T DbList<T>::getHead()
{
	if(begin == end)
	{
		cout<<"空链表无头..."<<endl;
		return NULL;
	}
	return begin->next->data;
}
template<class T>
Status DbList<T>::push_front(T x)
{
	DbListNode<T> *s = new DbListNode<T>;
	if(begin == end)
	{
		end = s;
	}
	s->data = x;
	s->next = begin->next;
	s->pre = begin;
	begin->next = s;
	s->next->pre = s;
	++size;
	return OK;
}
template<class T>
Status DbList<T>::push_back(T x)
{
	DbListNode<T> *s = new DbListNode<T>;
	s->data = x;
	s->pre = end;
	s->next = end->next;
	end->next = s;
	s->next->pre = s;
	end = s;
	++size;
	return OK;
}
template<class T>
void DbList<T>::makeEmpty()
{
	if(IsEmpty())
	{
		cout<<"链表已空(make empty)..."<<endl;
	}
	else
	{
		DbListNode<T> *p = begin->next;
		while(p!=begin)
		{
			p->pre->next = p->next;
			p->next->pre = p->pre;
			delete p;
			p = begin->next;
		}
		end = begin;
		size = 0;
	}

}

#if 1
#include"Dblist.h"
int main()
{
    DbList<int> myls;
	int select = 1;
	while(select)
	{
		cout<<"||========================================||"<<endl;
		cout<<"||==[1]push_front    [2]push_back=======||"<<endl;
		cout<<"||==[3]show_list     [4]getlenth========||"<<endl;
		cout<<"||==[5]getHead_val    [6]getLast_val=====||"<<endl;
		cout<<"||==[7]quit                       ===||"<<endl;
		cout<<"||==[9]makeEmpty     [10]pop_back=======||"<<endl;
		cout<<"||==[11]pop_front    [12]insert_val=====||"<<endl;
		cout<<"||==[13]del_val      [14]sort===========||"<<endl;
		cout<<"||==[15]reverse      [16]find_val_rid===||"<<endl;  
		cout<<"||========================================||"<<endl;
		cout<<"请输入您的选择:>";
		cin>>select;
		system("cls");
		switch(select)
		{
		case 1:
			int val_pf;
			cout<<"请输入插入的值(以-1结束):>"<<endl;
			while(cin>>val_pf,val_pf!=-1)
			{
				myls.push_front(val_pf);
			}
			break;
		case 2:
			int val_pb;
			cout<<"请输入插入的值(以-1结束):>"<<endl;
			while(cin>>val_pb,val_pb!=-1)
			{
				myls.push_back(val_pb);
			}
			break;
		case 3:
     		myls.show_dblist();
			break;
		case 4:
			size_t size;
			size = myls.getLenth();
			cout<<"循环链表长度为:"<<size<<endl;
			break;
		case 5:
			int head;
			head = myls.getHead();
			cout<<"该链表的第一个为:"<<head<<endl;
			break;
		case 6:
			int last;
			last = myls.getLast();
			cout<<"该链表的最后一个值为:"<<last<<endl;
			break;
		case 7:
			exit(1);
			break;
		case 9:
			myls.makeEmpty();
			break;
		case 10:
			myls.pop_back();
			break;
		case 11:
			myls.pop_front();
			break;
		case 12:
			int val_insert;
			cout<<"请输入您要插入的值:>";
			cin>>val_insert;
			myls.insert_val(val_insert);
			break;
		case 13:
			int val_del;
			cout<<"请输入您要删除的值:>";
			cin>>val_del;
			myls.del_val(val_del);
			break;
		case 14:
			myls.sort();
			break;
		case 15:
			myls.reverse();
			break;
			}
	}
	return 0;
}
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值