双向链表&双向循环链表

 代码1


#include <iostream>
using namespace std;
#include<time.h>
#include<stdlib.h>


struct Node
{
	Node(int data = 0) 
		:data_(data), 
		next_(nullptr), 
		pre_(nullptr) 
	{};
	int data_;
	Node* next_;//指向下一个
	Node* pre_;//指向前一个
};

class doubleLink
{
public:
	doubleLink()
	{
		head_ = new Node();
	}
	~doubleLink()
	{
		Node* p = head_;
		while (p != nullptr)
		{
			head_ = head_->next_;
			delete p;
			p = head_;
		}
	}
public:
	//头插法
	void insertHead(int val)
	{
		Node* node = new Node(val);
		node->next_ = head_->next_;
		if (head_->next_ != nullptr)
		{
			head_->next_->pre_ = node;
		}
		head_->next_ = node;
		node->pre_ = head_;
	}
	//尾插法
	void insertTail(int val)
	{
		Node* node = new Node(val);
		Node* p = head_;
		while (p->next_ != nullptr)
		{
			p = p->next_;
		}
		p->next_ = node;
		node->pre_ = p;
	}
	//结点删除
	void removeall(int val)
	{
		Node* p = head_->next_;
		while (p!=nullptr)
		{
			if (p->data_ == val)
			{
				Node* q = p->pre_;
				q->next_ = p->next_;
				if (p->next_ != nullptr)
				{
					p->next_->pre_ = q;
				}
				delete p;
				p = q->next_;
			}
			else
			{
				p = p->next_;
			}
		}
	}
	//结点搜索
	bool find(int val)
	{
		Node* p = head_->next_;
		while (p != nullptr)
		{
			if (p->data_ == val)
			{
				return true;
			}
			else
			{
				p = p->next_;
			}
		}
		return false;
	}
	//链表打印
	void show()
	{
		Node* p = head_->next_;
		while (p != nullptr)
		{
			cout << p->data_ << " ";
			p = p->next_;
		}
		cout << endl;
	}
private:
	Node* head_;
};
int main()
{
	doubleLink dlink;
	dlink.show();

	dlink.insertTail(1);
	dlink.insertTail(2);
	dlink.insertTail(3);
	dlink.insertTail(4);
	dlink.insertTail(5);
	dlink.show();

	dlink.insertTail(100);
	dlink.insertHead(100);
	dlink.insertHead(100);
	dlink.show();

	dlink.removeall(100);
	dlink.removeall(3);
	dlink.show();
	cout << dlink.find(100) << endl;
	return 0;
}

代码2


#include <iostream>
using namespace std;
#include<time.h>
#include<stdlib.h>


struct Node
{
	Node(int data = 0) 
		:data_(data), 
		next_(nullptr), 
		pre_(nullptr) 
	{};
	int data_;
	Node* next_;//指向下一个
	Node* pre_;//指向前一个
};

class doubleCircleLink
{
public:
	doubleCircleLink()
	{
		head_ = new Node();
		head_->next_ = head_;
		head_->pre_ = head_;
	}
	~doubleCircleLink()
	{
		Node* p = head_->next_;
		while (p != head_)
		{
			head_->next_ = p->next_;
			p->next_->pre_ = head_;//循环里没有结点的地址域为空
			delete p;
			p = head_->next_;
		}
		delete head_;
		head_ = nullptr;
	}
public:
	//头插法
	void insertHead(int val)
	{
		Node* node = new Node(val);
		node->next_ = head_->next_;
		head_->next_->pre_ = node;
		head_->next_ = node;
		node->pre_ = head_;
	}
	//尾插法
	void insertTail(int val)
	{
		Node* node = new Node(val);
		Node* p = head_->pre_;
		node->next_ = head_;
		node->pre_ = p;
		head_->pre_ = node;
		p->next_ = node;
	}
	//结点删除
	void removeall(int val)
	{
		Node* p = head_->next_;
		while (p!=head_)
		{
			if (p->data_ == val)
			{
				Node* q = p->pre_;
				q->next_ = p->next_;
				p->next_->pre_ = q;
				delete p;
				p = q->next_;
			}
			else
			{
				p = p->next_;
			}
		}
	}
	//结点搜索
	bool find(int val)
	{
		Node* p = head_->next_;
		while (p != head_)
		{
			if (p->data_ == val)
			{
				return true;
			}
			else
			{
				p = p->next_;
			}
		}
		return false;
	}
	//链表打印
	void show()
	{
		Node* p = head_->next_;
		while (p != head_)
		{
			cout << p->data_ << " ";
			p = p->next_;
		}
		cout << endl;
	}
private:
	Node* head_;
	Node* tail_;
};
int main()
{
	doubleCircleLink dlink;
	dlink.show();

	dlink.insertTail(1);
	dlink.insertTail(2);
	dlink.insertTail(3);
	dlink.insertTail(4);
	dlink.insertTail(5);
	dlink.show();

	dlink.insertTail(100);
	dlink.insertHead(100);
	dlink.insertHead(100);
	dlink.show();

	dlink.removeall(100);
	dlink.removeall(3);
	dlink.show();
	cout << dlink.find(100) << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值