c++模拟实现带头循环双向链表

思路:通单链表相似,不过该链表节点包含两个指针域和一个数据域,一个指针域指向前一个,一个指针域指向后一个,其他通单链表相似;

test.h

#define _CRT_SECURE_NO_WARNINGS 1
// 2、带头双向循环链表增删查改实现
typedef int LTDataType;
typedef struct ListNode
{
	LTDataType _data;
	struct ListNode* _next;
	struct ListNode* _prev;
}ListNode;

class List
{
public:
	List();
	~List();
	ListNode* BuyNode(LTDataType x);
	void ListPushBack(LTDataType x);
	void ListPopBack();
	void ListPushFront(LTDataType x);
	void ListPopFront();
	ListNode* ListFind(LTDataType x);
	void ListRemove(LTDataType x);
	void ListPrint();

private:
	ListNode* _head;
};

main.c

ListNode* List::BuyNode(LTDataType x)
{
	ListNode* tmp = new ListNode;
	tmp->_data = x;
	tmp->_next = tmp->_prev = nullptr;
	return tmp;
}

List::List()
{
	this->_head = this->BuyNode(0);
	this->_head->_next = this->_head;
	this->_head->_prev = this->_head;
}

List::~List()
{
	ListNode* cur = this->_head->_next;

	while (cur != this->_head)
	{
		ListNode* next = cur->_next;
		ListNode* prev = cur->_prev;

		prev->_next = next;
		next->_prev = prev;

		delete cur;

		cur = next;
	}

}

void List::ListPushBack(LTDataType x)
{
	ListNode* tmp = this->BuyNode(x);

	this->_head->_prev->_next = tmp;
	tmp->_next = this->_head;

	tmp->_prev = this->_head->_prev;
	this->_head->_prev = tmp;
}

void List::ListPrint()
{
	if (this->_head->_next == this->_head)
	{
		cout << "链表为空" << endl;
		return;
	}

	ListNode* cur = this->_head->_next;
	while (cur != this->_head)
	{
		cout << cur->_data << "->";
		cur = cur->_next;
	}
	cout << "NULL" << endl;
}

void List::ListPopBack()
{
	ListNode* cur = this->_head->_prev;
	this->_head->_prev = cur->_prev;
	cur->_prev->_next = this->_head;
	delete cur;
}

void List::ListPushFront(LTDataType x)
{
	ListNode* cur = this->_head->_next;
	ListNode* tmp = this->BuyNode(x);

	this->_head->_next = tmp;
	tmp->_next = cur;

	cur->_prev = tmp;
	tmp->_prev = this->_head;
}

void List::ListPopFront()
{
	ListNode* cur = this->_head->_next;

	this->_head->_next = cur->_next;
	cur->_next->_prev = this->_head;
	delete cur;
}

ListNode* List::ListFind(LTDataType x)
{
	ListNode* cur = this->_head->_next;

	while (cur != this->_head)
	{
		if (cur->_data == x)
		{
			return cur;
		}

		cur = cur->_next;

	}

	return nullptr;
}

void List::ListRemove(LTDataType x)
{
	ListNode* cur = this->ListFind(x);

	ListNode* prev = cur->_prev;
	ListNode* next = cur->_next;

	prev->_next = next;
	next->_prev = prev;

	delete cur;
}

void main()
{
	List l;
	l.ListPushBack(0);
	l.ListPushBack(1);
	l.ListPushBack(2);
	l.ListPushBack(3);
	l.ListPrint();
	//l.ListPopBack();
	l.ListPrint();
	l.ListPushFront(7);
	l.ListPopFront();
	l.ListRemove(3);
	l.ListPrint();
	l.~List();
	l.ListPrint();

	return 0;
}

截图:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值