当前位置: 首页 > 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.xdnf.cn/news/1201429.html

相关文章:

  • 【PCIe 总线及设备入门学习专栏 5.3.4 -- PCIe PHY Firmware 固件加载流程】
  • Android启动时间优化大全
  • 通信名词解释:I2C、USART、SPI、RS232、RS485、CAN、TCP/IP、SOCKET、modbus等
  • Window 部署 coze-stdio(coze 开发平台)
  • vue3.6更新哪些内容
  • 电子电路设计学习
  • MySQL - 索引(B+树)
  • Python Pandas.cut函数解析与实战教程
  • 力扣热题100----------41.缺少的第一个正数
  • C++算法竞赛篇(五)循环嵌套题型讲解
  • JavaScript手录07-数组
  • JavaScript核心概念全解析
  • 创建属于自己的github Page主页
  • 【Python系列】Flask 应用中的主动垃圾回收
  • 安装redis
  • 生成式召回-TIGER范式
  • Vim 编辑器工作模式及操作指南
  • 抗辐照芯片在低轨卫星星座CAN总线通讯及供电系统的应用探讨
  • 比特币运行机制全解析:区块链、共识算法与数字黄金的未来挑战
  • rapidocr v3.3.0发布了
  • OpenLayers 综合案例-轨迹回放
  • Torchv Unstrustured 文档解析库
  • C语言:函数
  • C/C++核心知识点详解
  • Qt C++ GUI 函数参数速查手册:基础与布局
  • RK3568 Linux驱动学习——Linux驱动开发准备工作
  • 【科研绘图系列】R语言绘制边际云雨图散点图
  • 基于大模型的预训练、量化、微调等完整流程解析
  • rust-模块树中引用项的路径
  • 1439-素数环2