📎个人主页:我的主页
📎小白一枚,欢迎指教👏
- 循环链表包括循环单链表,和循环双链表。单链表的尾结点的next指针指向NULL;而循环单链表的尾结点的next指针指向头结点。
一、初始化一个循环单链表
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){
if (L->next==L)
return true;
else
return false;
}
-------------------------------------
//判断结点p是否为循环单链表的表尾结点
bool isTail(LinkList L,LNode *p){
if (p->next==L)
return true;
else
return false;
}
- 注意:如果是循环单链表,可以让L指向表尾元素(插入、删除时可能需要修改L)
二、循环双链表
(所有的next指针和prior指针都分别形成了一个指针)
//初始化空的循环双链表
bool InitDLinkList(DLinklisk &L){
L=(DNode *)malloc(sizeof(DNode)); //分配一个头结点
if(L==NULL) 内存不足,分配失败
return false;
L->prior=L; //头结点的prior指向头结点
L->next=L; //头结点的next指向头结点
return true;
}
void testLinkList(){ //初始化循环双链表
DLinkList L;
InitDLink(L);
//后续代码......
}
typedef struct DNode{
ElemType data;
struct DNode *prior,*next;
}DNode ,*DLinklist;
---------------------------------
//判断循环双链表是否为空
bool Empty(DLinklist L){
if (L->next==L)
return true;
else
return false;
}
------------------------------------
//判断 结点p是否为循环双链表的表尾结点
bool isTail(DLinklist L,DNode *p){
if (p->next==L)
return true;
else
return false;
}
四、循环双链表的插入删除操作
(此时双链表的插入删除操作在循环双链表中不会有错误!)
- 双链表的插入:
//在p结点后插入s结点
bool InsertNextDNode(DNode *p,DNode *s){
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
}
- 删除
// 删除p的后继结点q
p->next=q->next;
q->next->prior=p;
free(q);