循环链表是另一种形式的链式存储结构。循环链表有循环单链表和循环双链表两种类型。循环链表的结点类型和非循环链表的结点类型相同。
把非循环单链表改为循环单链表只要把它的尾结点next指针域由原来的NULL改为指向头节点就行了。从循环单链表的任何一个结点出发均可找到链表中的其他结点。双链表的尾结点的next指针域指向头节点,头节点的prior指针域指向尾结点就形成了一个循环双链表。
单链表:
循环单链表:
双链表:
循环双链表:
参考非循环链表的实现:
例如原来的创建非循环单链表算法改为创建循环单链表:
void CreateListR(LinkNode * &L, ElemType a[], int n)
{
LinkNode * s,*r;
L = (LinkNode*)malloc(sizeof(LinkNode));//创建头节点
r = L; //r始终指向尾结点,初始化时指向头节点
for (int i = 0; i < n; i++)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = a[i]; //创建数据结点s
r->next = s; //将结点s插入结点r之后
r= s;
}
//r->next = NULL;
r->next = L; //尾结点的next域指向L
}
循环链表的基本算法实现与其对应的非循环链表的算法基本相同,主要差别是对于循环单链表或循环双链表L,判断尾结点p的条件是 p->next==L;另外,在循环双链表中可以通过 L->prior 快速找到尾结点。