循环链表(循环单链表循环双链表)的相关操作的代码实现(C语言)
Posted bfhonor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环链表(循环单链表循环双链表)的相关操作的代码实现(C语言)相关的知识,希望对你有一定的参考价值。
一、循环链表
(一)循环单链表
- 单链表和循环单链表的区别:
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;
}
(二)循环双链表
1. 循环双链表的初始化
- 初始化空的循环双链表
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;
}
void testDLinklist(){
//初始化循环双链表
DLinklist L;
InitDLinkList(L);
///..后续代码..
}
- 判断循环双链表是否为空
bool Empty(DLInklist L){
if(L -> next == L)//👈是否指向链表自身
return true;
else
return false;
}
2. 双链表的插入
//在p结点之后插入s结点
bool InsertNextDNode(DNode *p, DNode *s){
s -> next = p -> next; //将结点*s插入到结点*pzhiho
p -> next -> prior = s; //👈,在双链表中出现错误;但是在循环双链表中不会出现错误
s -> prior = p;
p -> next = s;
}
3. 双链表的删除
//删除p的后继结点q
p -> next = q -> next;
q -> next -> prior = p;//👈,在双链表中出现错误;但是在循环双链表中不会出现错误
free(q);
以上是关于循环链表(循环单链表循环双链表)的相关操作的代码实现(C语言)的主要内容,如果未能解决你的问题,请参考以下文章
(王道408考研数据结构)第二章线性表-第三节3:循环单链表和循环双链表
C/C++语言数据结构快速入门(代码解析+内容解析)链表(单链表,双链表,循环链表,静态链表)