上期我们说到填加以及放入库,这期我完善代码,并附上代码给大家分享
测试代码如下:
之前写的代码迭代器缺了一个构造,这次补充了复制构造,同类赋值以及删除一个的函数完整代码如下:
#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;
}
};
代码已经附上,我只测试了一遍,如果要运用到实际中,还请多多测试以及扩展想要的部分。
写写,下次我会给大家分享一下自定义内存!谢谢关注