赞
踩
循环单链表(Circular Singly Linked List)是一种特殊类型的单链表,其中最后一个节点的指针指向头节点,形成一个循环。
循环单链表与普通单链表的主要区别在于,循环单链表的尾节点的指针不是指向 nullptr,而是指向头节点,形成一个闭环。这意味着,在循环单链表中,可以通过尾节点的指针重新回到头节点。
循环单链表的特点和优势:
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;
}
循环双链表(Circular Doubly Linked List)是一种特殊类型的双向链表,其中最后一个节点的下一个指针指向头节点,头节点的前一个指针指向最后一个节点,形成一个循环。
循环双链表与普通双链表的主要区别在于,循环双链表既具有双向链表的前驱和后继关系,也具有循环遍历的能力。
循环双链表的特点和优势:
注意:在插入和删除节点时,要确保更新前驱和后继指针的正确性,以避免链表中断或形成其他错误结构。在循环双链表中遍历时要设置终止条件,防止进入无限循环。
当我们在初始化一个双链表时,需要让头结点的前指针和后指针都指向头结点自己(而普通的双链表指向NULL)
typedef struct DNode{
ElemType data;
struct DNode *prior,*next;
}DNode, *DLinkList;
//初始化空的循环双链表
bool InitDLinkList(DlinkList &L){
L = (DNode*) malloc(sizeof(DNode)); //分配一个头结点
if(L == NULL) //内存不足,分配失败
return false;
L->prior = L; //头结点的prior指向头结点
L->next = L; //头结点的next指向头结点
return true; //初始化成功
}
检查头结点next指针是否指向它自己
//判断循环链表是否为空
bool Empty(DLinkList L){
if(L->next == L)
return true;
else
return false;
}
检查头结点next指针是否指向头结点
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;//如果p没有后继结点,普通链表会出问题
s->prior = p;
p->next = s;
}
//删除p的后继结点q
p->next = q->next;
q->next->prior = p; //如果p没有后继结点,普通链表会出问题
free(q);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。