数据结构—循环链表
循环单链表
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode, *LinkList;
循环单链表初始化
bool InitList(LinkList &L)
{
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL) return false;
L->next = L; //头结点next指向头结点
return true;
}
判断循环单链表是否为空
bool Empty(LinkList L)
{
return L->next == L;
}
判断结点p是否为循环单链表的表尾结点
bool IsTail(LinkList L, LNode* p)
{
return p->next == L;
}
很多时候对链表的操作都是在头部或尾部
这时候就可以显现出循环链表的方便性
从头结点找到尾部,时间复杂度为O(n)
从尾部找到头部,时间复杂度为O(1)
循环双链表
typedef struct DNode
{
ElemType data;
struct DNode *next, *prior;
}DNode, *DLinkList;
循环双链表的初始化
bool InitDLinkList(DLinkList &L)
{
L = (DNode*)malloc(sizeof(DNode));
if (L == NULL) return false;
L->next = L; ///头结点的next指向头结点
L->prior = L; //头结点的prior指向头结点
return true;
}
判断循环双链表是否为空
bool Empty(DLinkList L)
{
return L->next == L;
}
判断结点p是否为循环双链表的尾结点
bool IsTail(DLinkList L, DNode* p)
{
return p->next == L;
}
在p结点之后插入s结点
bool InsertNextDNode(DNode* p, DNode* s)
{
s->next = p->next;
s->prior = p;
p->next->prior = s;
p->next = s;
}
删除p的后继结点q
p->next = q->next;
q->next->prior = p;
free(q);