数据结构:循环链表

简介: 【7月更文挑战第21天】

文章目录
1.循环链表的基本结构
1.1节点结构体的定义
1.2循环链表的初始化
2.循环链表的一些基本的操作
2.1插入节点
2.2删除节点
2.3遍历循环链表
2.4清空循环链表
2.5寻找节点

循环链表是另一种形式的链式存储结构,其特点是最后一个节点的指针指向链表的第一个节点,形成一个闭环。本文将详细介绍如何在C语言中实现循环链表。
1.循环链表的基本结构
1.1节点结构体的定义
//结点的构建
typedef int ElemType;
typedef struct LNode {
ElemType data; //数据域
struct LNode next; //节点域
}LNode,
LinkNode;
1
2
3
4
5
6
1.2循环链表的初始化
//循环链表初始化
void InitLinkList(LinkNode L,int initdata) {
L = (LNode*)malloc(sizeof(LNode)); //向内存请求存储空间
L->data = initdata;
L->next = L; //使头结点指向自己
}
1
2
3
4
5
6
2.循环链表的一些基本的操作
2.1插入节点
在循环链表中插入节点可以有不同的位置,例如在头部、尾部或指定位置。以下是在尾部插入节点的示例:

void InsertTail(LinkNode L, ElemType e) {
LinkNode newNode = (LinkNode)malloc(sizeof(LNode));
if (newNode == NULL) {
fprintf(stderr, "Memory allocation failed\n");
exit(EXIT_FAILURE);
}
newNode->data = e;
newNode->next = L->next; // 新节点的next指向头节点的next
L->next = newNode; // 头节点的next指向新节点
}
1
2
3
4
5
6
7
8
9
10
2.2删除节点
void DeleteNode(LinkNode
L, ElemType e) {
LinkNode current = L, prev = NULL;
while (current->next != L && current->data != e) {
prev = current;
current = current->next;
}
if (current->data == e) {
if (prev == NULL) { // 删除头节点
L = current->next;
} else {
prev->next = current->next;
}
free(current);
} else {
printf("Element not found\n");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2.3遍历循环链表
遍历循环链表是查看链表中所有节点数据的一种方法。由于循环链表的特性,需要特别注意避免无限循环:

void TraverseList(LinkNode L) {
if (L == NULL) return;
LinkNode current = L->next; // 从头节点的next开始遍历
do {
printf("%d ", current->data);
current = current->next;
} while (current != L->next); // 当遍历回到头节点的next时停止
printf("\n");
}
1
2
3
4
5
6
7
8
9
2.4清空循环链表
void ClearList(LinkNode* L) {
LinkNode current = L, nextNode;
while (current != L) {
nextNode = current->next;
free(current);
current = nextNode;
}
free(L);
L = NULL;
}
1
2
3
4
5
6
7
8
9
10
2.5寻找节点
LinkNode FindNode(LinkNode L, ElemType e) {
LinkNode current = L->next; // 从头节点的next开始遍历
do {
if (current->data == e) {
return current;
}
current = current->next;
} while (current != L->next); // 当遍历回到头节点的next时停止
return NULL;
}

相关文章
|
9天前
|
缓存
数据结构之 - 链表数据结构详解: 从基础到实现
数据结构之 - 链表数据结构详解: 从基础到实现
46 6
|
9天前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
82 64
|
3天前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
18 7
|
3天前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
14 3
|
2天前
|
算法 Java
数据结构与算法学习五:双链表的增、删、改、查
双链表的增、删、改、查操作及其Java实现,并通过实例演示了双向链表的优势和应用。
数据结构与算法学习五:双链表的增、删、改、查
【数据结构】——双向链表详细理解和实现
【数据结构】——双向链表详细理解和实现
|
6天前
|
存储 Java
【数据结构】链表
【数据结构】链表
12 1
|
7天前
|
存储 缓存
数据结构3——双向链表
数据结构3——双向链表
51 1
|
1天前
|
存储
探索数据结构:便捷的双向链表
探索数据结构:便捷的双向链表
|
1天前
|
存储
探索数据结构:单链表的实践和应用
探索数据结构:单链表的实践和应用