数据结构,高效率循环链表三

上期我们说到填加以及放入库,这期我完善代码,并附上代码给大家分享
测试代码如下:
在这里插入图片描述
之前写的代码迭代器缺了一个构造,这次补充了复制构造,同类赋值以及删除一个的函数完整代码如下:

#pragma once

template<typename T>
class CycleList
{
	struct Node
	{
		T value;        //值
		Node* pNext;    //上一个
		Node* pFont;    //下一个
	};

	Node* m_pHead;       //头节点
	Node* m_pLibary;     //库节点
	int m_size;     

public:
	class iterator
	{
		Node* m_p;
		friend class CycleList;
	public:
		iterator(Node* p)
		{
			m_p = p;
		}
		bool operator==(iterator other)
		{
			if (m_p == other.m_p)
				return true;
			return false;
		}
		bool operator!=(iterator other)
		{
			if (m_p != other.m_p)
				return true;
			return false;
		}
		void operator++(int)
		{
			m_p = m_p->pNext;
		}
		void operator++()
		{
			m_p = m_p->pNext;
		}
		void operator--(int)
		{
			m_p = m_p->pFont;
		}
		void operator--()
		{
			m_p = m_p->pFont;
		}
		T operator*()
		{
			return m_p->value;
		}
	};

public: 
	CycleList()
	{
		m_pHead = new Node;
		m_pHead->pNext = m_pHead;
		m_pHead->pFont = m_pHead;

		m_pLibary = new Node;
		m_pLibary->pNext = m_pLibary;
		m_pLibary->pFont = m_pLibary;

		m_size = 0;
	}

	~CycleList()
	{
		clear();
		delete m_pHead;
		delete m_pLibary;
	}

	CycleList(const CycleList& other)
	{
		m_pHead = new Node;
		m_pHead->pNext = m_pHead;
		m_pHead->pFont = m_pHead;

		m_pLibary = new Node;
		m_pLibary->pNext = m_pLibary;
		m_pLibary->pFont = m_pLibary;

		m_size = 0;

		for (Node* p = other.m_pHead->pNext; p != other.m_pHead; p = p->pNext)
		{		
			add(p->value);
		}	
	}

	void operator=(const CycleList& other)
	{
		clear();
		for (Node* p = other.m_pHead->pNext; p != other.m_pHead; p = p->pNext)
		{
			add(p->value);
		}
	
	}


	void add(T value)
	{
		Node* pNew = 0;
		if (m_pLibary->pNext == m_pLibary)
			pNew = new Node;
		else
		{
			pNew = m_pLibary->pFont;
			BreakLink(pNew,pNew);			
		}
		LinkNode(pNew,pNew,m_pHead);
		pNew->value = value;
		m_size++;
	}

	void push_libary()
	{
		Node* head = m_pHead->pNext;
		Node* tail = m_pHead->pFont;
		BreakLink(head, tail);
		LinkNode(head, tail,m_pLibary);	
		m_size = 0;
	}

	/// <summary>
	/// 删除一个并返回下一个迭代器
	/// </summary>
	/// <param name="iter"></param>
	/// <returns></returns>
	iterator erase(const iterator & iter)
	{
		Node* pNext = iter.m_p->pNext;
		BreakLink(iter.m_p,iter.m_p);
		LinkNode(iter.m_p, iter.m_p,m_pLibary);
		return pNext;
	}

	void clear()
	{
		for (Node* p = m_pHead->pNext; p != m_pHead;)
		{
			Node* pDelete = p;
			p = p->pNext;
			delete pDelete;
		}

		for (Node* p = m_pLibary->pNext; p != m_pLibary;)
		{
			Node* pDelete = p;
			p = p->pNext;
			delete pDelete;

		}
		m_pHead->pNext = m_pHead;
		m_pHead->pFont = m_pHead;
		m_pLibary->pNext = m_pLibary;
		m_pLibary->pFont = m_pLibary;
		m_size = 0;
	}

	iterator begin()
	{
		return m_pHead->pNext;
	}

	iterator end()
	{
		return m_pHead;
	}

private:
	//参一 目标节点串头部, 参二目标节点串尾部,参三需要链接位置
	void LinkNode(Node* targetHead,Node* targetTail,Node* head) 
	{
		Node* pTail = head->pFont;
		pTail->pNext = targetHead;
		targetHead->pFont = pTail;
		targetTail->pNext = head;
		head->pFont = targetTail;
	}

	void BreakLink(Node* targetHead,Node* targetTail)
	{
		Node* pNext = targetTail->pNext;
		Node* pFont = targetHead->pFont;
		pNext->pFont = pFont;
		pFont->pNext = pNext;
	}

};

代码已经附上,我只测试了一遍,如果要运用到实际中,还请多多测试以及扩展想要的部分。
写写,下次我会给大家分享一下自定义内存!谢谢关注

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

流通币

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值