环状链表是链表的特殊形式,其区别在于将循环中的判断条件NULL更换成first,
而insert()等查函数根据实际情况考虑是否有越界循环情况
其他大部分相同
代码如下
#include<iostream>
using namespace std;
template<class T>
struct LinkNode
{
T data;
LinkNode<T>* link;
LinkNode(LinkNode<T>* ptr = NULL) { link = ptr; }
LinkNode(T item, LinkNode<T>* ptr = NULL) { link = ptr; data = item; }
};
template<class T>
class CircleList
{
private:
LinkNode<T>* first;
public:
CircleList() { first = new LinkNode<T>; first->link = first; }
CircleList(CircleList<T>& L);
~CircleList();
int Length()const;
bool isEmpty()const;
CircleList<T>* getHead()const { return first; }
CircleList<T>* Search(T x)const;
T getData(int i)const;
void setData(int i, T x);
bool insert(int i, T x);
bool remove(int i, T& x);
void input();
void output();
};
template<class T>
bool CircleList<T>::isEmpty()const
{
return first->link == first;
}
template<class T>
CircleList<T>::CircleList(CircleList<T>& L)
{
LinkNode<T>* p = first->link;
LinkNode<T>* q = L.getHead()->link;
while (q != first)
{
LinkNode<T>* r = new LinkNode<T>(q->data);
p->link = r;
p = p->link;
q = q->link;
}
p->link = first;
}
template<class T>
CircleList<T>::~CircleList()
{
LinkNode<T>* p = first->link;
while (p != first)
{
LinkNode<T>* q = p;
p = p->link;
delete q;
}
delete p;
}
template<class T>
int CircleList<T>::Length()const
{
int count = 0;
LinkNode<T>* p = first->link;
while (p != first)
{
count++;
p = p->link;
}
return count;
}
template<class T>
CircleList<T>* CircleList<T>::Search(T x)const
{
LinkNode<T>* p = first->link;
while (p != first)
{
if (p->data == x)
{
return p;
}
p = p->link;
}
return NULL;
}
template<class T>
T CircleList<T>::getData(int i)const
{
int count = 0;
LinkNode<T>* p = first->link;
while (1)
{
if(p!=first)
count++;
if (count == i)
{
return p->data;
}
p = p->link;
}
return count;
}
template<class T>
void CircleList<T>::setData(int i, T x)
{
int count = 0;
LinkNode<T>* p = first->link;
while (p != first)
{
count++;
if (count == i)
{
p->data = x;
}
p = p->link;
}
}
template<class T>
bool CircleList<T>::insert(int i, T x)
{
if (i <= 0 || i >= Length() + 1)
{
return false;
}
int count = 0;
LinkNode<T>* p = first->link;
while (p != first)
{ count++;
if (count == i-1)
{
break;
}
p = p->link;
}
LinkNode<T>* q = new LinkNode<T>(x);
q->link = p->link;
p->link = q;
return true;
}
template<class T>
bool CircleList<T>::remove(int i,T&x)
{
if (i <= 0 || i >= Length()||isEmpty())
{
return false;
}
int count = 0;
LinkNode<T>* p = first->link;
while (p != first)
{
count++;
if (count == i - 1)
{
break;
}
p = p->link;
}
LinkNode<T>* q = p->link;
x = p->data;
p->link = q->link;
delete q;
return true;
}
template<class T>
void CircleList<T>::input()
{
int count = 0;
cout << "请输入链表初始大小" << endl;
while (count <= 0)
cin >> count;
cout << "请输入每一个值" << endl;
LinkNode<T>* p = first;
while (count--)
{
T temp; cin >> temp;
LinkNode<T>* q = new LinkNode<T>(temp);
p->link = q;
p = p->link;
}
p->link = first;
}
template<class T>
void CircleList<T>::output()
{
LinkNode<T>* p = first->link;
while (p != first)
{
cout << p->data << " ";
p = p->link;
}
}