当前位置: 首页 > news >正文

算法竞赛阶段二-数据结构(37)数据结构循环链表模拟实现

之前单链表中,数组全初始化为0,末尾最后一个next 存的就是0,指向的就是头节点

循环链表的基本概念

循环链表是一种特殊的链表,其尾节点的指针域指向头节点,形成一个闭环。与普通单链表相比,循环链表的遍历需要额外注意终止条件,避免无限循环。


循环链表的节点结构

循环链表的节点与普通链表节点相同,包含数据域和指针域。以C语言为例:

typedef struct Node {int data;           // 数据域struct Node *next;  // 指针域,指向下一个节点
} Node;


循环链表的初始化

初始化时,头节点的指针域指向自身,形成空循环链表:

Node* initList() {Node *head = (Node*)malloc(sizeof(Node));if (head != NULL) {head->next = head;  // 头节点指向自身}return head;
}


循环链表的插入操作

头插法

新节点插入到头节点之后:

void insertAtHead(Node *head, int data) {Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = head->next;head->next = newNode;
}

尾插法

新节点插入到尾节点之后(需先遍历到尾节点):

void insertAtTail(Node *head, int data) {Node *current = head;while (current->next != head) {current = current->next;}Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = head;current->next = newNode;
}


循环链表的删除操作

删除指定值的节点:

void deleteNode(Node *head, int data) {Node *current = head;while (current->next != head) {if (current->next->data == data) {Node *temp = current->next;current->next = temp->next;free(temp);return;}current = current->next;}
}


循环链表的遍历

遍历时需检查是否回到头节点:

void traverseList(Node *head) {Node *current = head->next;while (current != head) {printf("%d ", current->data);current = current->next;}printf("\n");
}


循环链表的销毁

释放所有节点内存,避免内存泄漏:

void destroyList(Node *head) {Node *current = head->next;while (current != head) {Node *temp = current;current = current->next;free(temp);}free(head);
}


注意事项

  1. 终止条件:循环链表的遍历和操作需明确终止条件(如current != head),否则会陷入无限循环。
  2. 边界处理:空链表时需确保头节点指向自身。
  3. 内存管理:动态分配的内存需及时释放。

通过上述方法,可以完整实现循环链表的基本操作。

http://www.lryc.cn/news/601621.html

相关文章:

  • print(“\033[31m红\033[32m绿\033[34m蓝\033[0m默认色“)
  • 零基础学习性能测试第五章:JVM性能分析与调优-JVM运行时内存区域介绍
  • Maven之多模块项目管理
  • C语言——关于指针(逐渐清晰版)
  • 嵌入式——单片机的独立按键
  • 数据结构基础内容(第七篇:堆、哈夫曼树)
  • 电子电气架构 --- 软件bug的管理模式
  • 「iOS」————MRC
  • Flink2.0学习笔记:Stream API 常用转换算子
  • 第十八章:AI的“通感”:揭秘图、文、音的共同语言——CLIP模型
  • 常见认证机制详解
  • Unity FXAA
  • 设计模式(六)创建型:单例模式详解
  • 五、搭建springCloudAlibaba2021.1版本分布式微服务-gateway网关
  • 新手开发 App,容易陷入哪些误区?
  • c++加载qml文件
  • 【学习笔记】DexMimicGen:通过模仿学习实现双臂灵巧操作的自动化数据生成
  • 小白成长之路-Ansible自动化(一)
  • 小白投资理财 - 从换手率和成交量分析股票趋势
  • 【机器学习深度学习】NLP评价指标 BLEU 和 ROUGE
  • 扩展组件(uni-ui)之uni-group
  • Dify 本地化部署深度解析与实战指南
  • C语言自定义数据类型详解(四)——联合体
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现PCB上二维码检测识别(C#代码UI界面版)
  • 2.安装CUDA详细步骤(含安装截图)
  • JavaEE--3.多线程
  • [N1盒子] 斐讯盒子N1 T1通用刷机包(可救砖)
  • [硬件电路-96]:什么是闭环反馈?什么是闭环正反馈控制?什么是闭环负反馈控制?
  • Java面试精进:测试、监控与序列化技术全解析
  • 【模电笔记】—— 波形发生电路(波形振荡器)