双向循环链表(模板实现)

C++数据结构之循环链表

前言

&emsp 此前有读者问我,C++的STL中为什么没有循环链表?我想大概率是因为循环链表的应用很少,另外如果使用者对循环链表的理解不足的话还很容易让程序陷入死循环。

代码实现

#pragma once
/*
 *实现循环链表
 */
template <typename T>
struct ListNode
{
	ListNode* m_next;
	ListNode* m_prev;
	T m_data;

	ListNode(T x)
		:m_next(nullptr)
		, m_prev(nullptr)
		, m_data(x)
	{}
};

template <typename T>
class CicList {
	typedef ListNode<T> Node;
public:
	CList()
		:_head(new Node(T()))
	{
		_head->_next = _head;
		_head->_prev = _head;
	}


	virtual	~CList()
	{
		Node *tmp = _head->_next;
		while (tmp != _head)
		{
			Node *cur = tmp->_next;
			delete tmp;
			tmp = cur;
		}
	}

	void setHead(T x) {
		_head->_data = x;
	}

	void push_front(const T & x) {
		Insert(_head->_next, x);
	}

	void push_back(const T &  x) {
		Insert(_head->_prev, x);
	}


private:
	//插入一个元素
	void Insert(Node* pos, T x)
	{
		Node *newnode = new Node(x);
		newnode->m_next = pos;
		pos->m_prev->m_next = newnode;
		newnode->m_prev = pos->m_prev;
		pos->m_prev = newnode;
	}
	//data
	Node* m_head;
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Albert

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值