什么事循环链表?
-概念上
·任意数据元素都有一个前驱和一个后继
·所有的数据元素的关系构成一个逻辑上的环
-实现上
·循环链表是一种特殊的单链表
·尾结点的指针域保存了首结点的地址
循环链表的实现思路
-通过模板定义CircleList类,继承自LinkList类
-定义内部函数last_to_first(),用于将单链表首尾相连
-特殊处理:首元素的插入操作和删除操作
-重新实现:清空操作和遍历操作
循环链表的实现要点
-插入位置为0时:
·头结点和尾结点均指向新结点
·新结点成为首结点插入链表
-删除位置为0时:
·头结点和尾结点指向位置为1的结点
·安全销毁首结点
template <typename T>
class CircleList : public LinkList<T>
{
protected:
typedef typename LinkList<T>::Node Node;
int mod(int i) const
{
return (this->m_length == 0) ? 0 : (i% this->length());
}
Node* last() const
{
return this->position(this->m_length-1)->next;
}
void last_to_first() const
{
last()->next = this->m_header.next;
}
public:
bool insert(const T& e)
{
return insert(this->m_length,e);
}
bool insert(int i,const T& e)
{
bool ret = true;
i = i % (this->m_length + 1);
ret = LinkList<T>::insert(i,e);
if(ret && (i == 0))
{
last_to_first();
}
return ret;
}
bool remove(int i)
{
bool ret = true;
i = mod(i);
if(i == 0)
{
Node* toDel = this->m_header.next;
if(toDel != NULL)
{
this->m_header.next = toDel->next;
this->m_length--;
if(this->m_length > 0)
{
last_to_first();
if(this->m_current == toDel)
{
this->m_current = toDel->next;
}
}
else
{
this->m_header.next = NULL;
this->m_current = NULL;
}
this->destroy(toDel);
}
else
{
ret = false;
}
}
else
{
ret = LinkList<T>::remove(i);
}
return ret;
}
bool set(int i,const T& e)
{
return LinkList<T>::set(mod(i),e);
}
bool get(int i)const
{
return LinkList<T>::get(mod(i));
}
bool get(int i,const T& e)const
{
return LinkList<T>::get(mod(i),e);
}
int find(const T& e) const
{
int ret = -1;
Node* slider = this->m_header.next;
for(int i =0;i<this->m_length;i++)
{
if(slider->value == e)
{
ret = i;
break;
}
slider = slider->next;
}
return ret;
}
void clear()
{
while(this->m_length > 1)
{
remove(1);
}
if(this->m_length == 1)
{
Node* toDel = this->m_header.next;
this->m_header.next = NULL;
this->m_length = 0;
this->m_current = NULL;
this->destroy(toDel);
}
}
bool move(int i,int step)
{
return LinkList<T>::move(mod(i),step);
}
bool end()
{
return (this->m_length == 0) || (this->m_current == NULL);
}
~CircleList()
{
clear();
}
};
总结:
-循环链表是一种特殊的单链表
-尾结点的指针域保存了首结点的地址
-特殊处理首元素的插入操作和删除操作
-重新实现清空操作和遍历操作
·