一、循环链表
1) 循环链表:是一种头尾相接的链表(表中最后一个结点的指针域指向头结点,整个链表形成一个环)
2) 优点: 从表中任一结点出发均可找到表中其他结点
3) 循环链表中没有NULL指针,当遍历链表时,终止条件是最后一个结点的指针域是否等于头指针
4) 尾指针表示单循环链表:
首元结点的存储位置: R->next->next;
最后一个结点的存储位置: R
//用尾指针表示单循环链表访问首尾结点时间复杂度都为O(1)
二、循环链表的基本操作
1.声明结点类型和指向结点的指针类型
typedef int Datatype;
typedef struct Node //声明结点的类型和指向结点的指针类型
{
Datatype data; //结点的数据域
struct Node *next; //结点的指针域
}Node,*pNode; //pNode为指向结点的指针类型
2.初始化链表
void InitList(pNode *p) //初始化链表
{
*p = (pNode)malloc(sizeof(Node)); //用头指针指向头结点
(*p)->next = (*p); //头结点的指针域指向头结点
}
3.判断链表是否为空
int IsEmpty(pNode *p) //判断链表是否为空
{
if ((*p)->next == (*p)) //判断头结点指针域是否指向头结点
return 1; //为空返回1
return 0; //不为空返回0
}
4.销毁链表
void Destroy(pNode *p) //销毁链表
{
pNode pL = (*p)->next; //将指针pL指向首元结点
(*p)->next = NULL; //将头结点的指针域置空
*p = pL;