循环链表和单链表很多操作是一样的,只是细小的区别。下面在单链表代码的基础上,定义一个循环单链表的类。并使用尾指针。
1.声明结点类型
结点类型和单链表一样。
/*************************/
/***** 声明模板类 *****/
/*************************/
template <class DataType>
struct Node
{
DataType data;
Node<DataType> *next;
};
2.声明循环链表类
也基本和单链表一样,只是使用的是尾指针。
template <class DataType>
class Circular_LinkList
{
public:
Circular_LinkList( ); //构造函数,含头结点的空链表
Circular_LinkList(DataType a[ ], int n); //构造函数,建立有n个元素的单链表
~Circular_LinkList( ); //析构函数
void PrintList( ); //遍历操作,按序号依次输出各元素
private:
Node<DataType> *rear; //单链表的尾指针
};
3.类的构造函数定义代码
/********************************/
/***** 定义模板类操作函数 *****/
/********************************/
template <class DataType>
Circular_LinkList<DataType> ::Circular_ LinkList( )
{
rear = new Node<DataType>; //生成头结点,头结点也是尾结点
rear->next =rear; //尾结点的指针域指向自己
}
template <class DataType>
Circular_LinkList<DataType> :: Circular_LinkList(DataType a[ ], int n)
{
Node<DataType> *f, *s;
rear = new Node<DataType>; //生成头结点
f = rear; //头结点指针初始化
for (int i = 0; i < n; i++)
{
s = new Node<DataType>; s->data = a[i]; //为每个数组元素建立一个结点
rear->next = s; rear = s; //将结点s插入到终端结点之后
}
r->next = f; //单链表建立完毕,将终端结点的指针指向头结点
}
其它函数代码大家自己可以写。