循环链表在概念就是任意数据元素都有一个前驱和一个后继(与单链表不同的重点,单链表首结点没有前驱而尾结点没有后继),所有的数据元素的关系构成一个逻辑上的环,在实现上,循环链表是一种特殊的单链表,其尾结点的指针域保存了首结点的地址,如下图所示
循环链表的实现思路
通过模板定义CircleList类,继承自LinkList单链表类
定义内部函数last_to_first(),用于将单链表首尾相连
特殊处理:首元素的插入操作和删除操作
重新实现:清空操作和遍历操作
要点:
1.插入位置为0时,头结点和尾结点均指向新结点,新结点指向原先的首结点成为首结点插入链表
先插入元素,如果该元素是0号元素则记得把尾结点连上
2.删除位置为0时,头结点和尾结点指向位置为1的结点,安全销毁原来的首结点
先是删除结点是否为0号元素,如果为0号元素则删除后记得判断是否长度大于,大于0的话则尾结点连上首结点
以下代码是CircleList.h的实现
#ifndef CIRCLELIST_H
#define CIRCLELIST_H
#include "LinkList.h"
namespace CGSLib
{
template <typename T>
class CircleList : public LinkList<T>
{
protected:
typedef typename LinkList<T>::Node Node; //使用typedef巧妙应用重新给父类的Node结点 命名
/*因为是循环链表所以要取模函数*/
int mod(int i)
{
return (this->m_length==0)?0:(i%this->m_length);
}
/*将尾结点连接到首结点*/
void last_to_first()const
{
last()->next = this->m_header.next;
}
/*找到尾结点*/
Node* last()const
{
return this->position(this->m_length-1)->next;
}
public:
/*插入函数*/
bool instert(const T &e)
{
return instert(this->m_length,e);
}
bool instert(int i,