数据结构-环形链表
单向环形链表头结点创建动态申请内存创建循环链表哨兵头结点内存分配失败打印提示并返回 NULL将头结点 next 指针指向自身构造空循环链表返回头结点地址。node_t *cycle_linklist_create(void) { node_t *head malloc(sizeof(node_t)); if(headNULL) { printf(malloc fail\n); return NULL; } head-next head; return head; }单向环形链表头节点后插入新节点判断头结点指针是否为 NULL非法则打印提示并直接返回动态分配新节点分配失败打印提示并返回指针 p 初始指向原首节点的后继节点给新节点填入数据新节点后继先指向原来链表第一个有效节点判断原链表为空new-next head 令新节点自环如果链表不为空p 向后循环遍历找到整条链表尾节点 将尾节点后继修改为新节点更新头结点后继指针指向新节点完成循环链表头插。void cycle_linklist_insert_head(node_t *head,data_t data) { if(headNULL) { printf(head is NULL\n); return ; } node_t *new malloc(sizeof(node_t)); if(newNULL) { printf(malloc fail\n); return ; } //记录首节点位置 node_t *p head-next-next; //新节点存入数据 new-data data; //新节点获取首节点位置 new-next head-next; //如果首节点位置为头结点则新节点的下一节点指向自己 if(new-next head) { new-next new; }else if(new-next ! head) { while(p-next!head-next) //如果新节点的下一节点不是头结点则循环到尾节点 p p-next; //尾节点的下一节点与首节点断开指向新节点 p-next new; } head-next new; //头节点与首节点断开指向新节点 }单向环形链表打印链表数据判断头结点指针是否为 NULL非法则打印提示并返回判断循环链表为空打印空链表提示并返回遍历指针 p 指向链表第一个有效节点while 循环条件当前节点后继不等于原首节点代表还未到达尾节点 打印当前节点数据指针向后移动退出循环时 p 停留在尾节点单独打印尾节点数据输出换行。void print_cycle(node_t *head) { if(headNULL) { printf(head is NULL\n); return ; } if(is_empty(head)0) { printf(is empty\n); return ; } node_t *p head-next; while(p-next! head-next) //循环打印直到尾节点 { printf(%d ,p-data); p p-next; } printf(%d\n,p-data); //单独打印尾节点数据 }单向环形链表按数据内容查找节点判断头结点指针是否为 NULL非法则打印提示并返回 NULL判断循环链表为空打印空链表提示并返回 NULL遍历指针 p 指向第一个有效节点while 循环条件当前节点后继不等于首有效节点说明还未到达尾节点 比对当前节点数据匹配成功直接返回当前节点地址 未匹配则 p 向后移动退出循环时 p 停留在尾节点单独比对尾节点数据尾节点匹配成功返回 p否则遍历完毕无匹配返回 NULL。node_t *cycle_linklist_find_key(node_t *head,data_t key) { if(headNULL) { printf(head is NULL\n); return NULL; } if(is_empty(head)0) { printf(is empty\n); return NULL; } node_t *p head-next; while(p-next! head-next) //同打印数据的思路先找到尾节点 { if(p-data key) { return p; } p p-next; } if(p-data key) //单独判断尾节点数据是否符合 { return p; }else { return NULL; //都没找到就返回NULL } }单向环形链表删除首节点判断头结点指针是否为 NULL非法打印提示并返回判断循环链表为空打印提示并返回temp 保存待删除的第一个有效节点p 用来寻找链表尾节点while 循环向后遍历直到 p 停在尾节点修改头结点后继指向原首节点的下一个节点修改尾节点的后继指向新的首节点维持环形结构释放原首节点内存完成循环链表头删void cycle_linklist_delete_head(node_t *head) { if(headNULL) { printf(head is NULL\n); return ; } if(is_empty(head)0) { printf(is empty\n); return ; } node_t *p head-next; node_t *temp head-next; while(p-next ! head-next) p p-next; head-next temp-next; p-next head-next; free(temp); }单向环形链表销毁判断二级指针 head 是否为 NULL参数非法直接返回判断循环链表为空释放头结点外部头指针置空后函数返回遍历指针 p 指向第一个有效节点while 循环条件当前节点后继不等于首有效节点 使用 temp 保存当前待释放节点 p 先向后移动 释放 temp 指向节点循环结束 p 停留在尾节点单独释放尾节点释放哨兵头结点通过二级指针将外部链表头指针置为 NULL消除野指针。void cycle_linklist_destroy(node_t **head) { if(headNULL) { printf(head is NULL\n); return ; } if(is_empty(*head)0) { free(*head); *head NULL; return ; } node_t *p (*head)-next; while(p-next ! (*head)-next) { node_t *temp p; p p-next; free(temp); } free(p); free(*head); *head NULL; return; }各函数功能与逻辑梳理1. cycle_linklist_create — 创建哨兵头结点动态 malloc 申请头结点内存分配失败打印信息返回NULL初始化空环head-next head返回哨兵头地址。2. cycle_linklist_insert_head — 头插头结点后插入新节点逻辑新节点成为第一个有效节点合法性校验头指针不能为 NULL新建节点 malloc 失败直接退出新节点数据赋值新节点先指向原来首个有效节点区分空链表 / 非空链表空链表处理边界非空链表遍历找到链表尾节点让尾节点next指向新节点修改哨兵头next指向新节点完成头插维持环形闭环。3. print_cycle — 遍历打印链表校验头指针与链表是否为空指针指向首个有效节点循环打印除尾节点以外所有节点循环结束后单独打印尾节点判断依据p-next ! 首有效节点判定未抵达尾部。4. cycle_linklist_find_key — 根据数值查找节点参数合法性、空链表判断从头结点后继开始遍历循环内依次比对数据循环只遍历到倒数第二个节点循环结束额外单独校验尾节点找到返回节点地址查找失败返回NULL。5. cycle_linklist_delete_head — 删除首个有效节点头删校验头指针、判断链表非空暂存待删除首节点遍历找到链表尾节点修改哨兵头next指向原第二个有效节点修改尾节点next指向新的首节点维持环形free 释放被删除节点内存。6. cycle_linklist_destroy — 销毁整条链表二级指针使用二级指针接收外部头地址最终可将外部头指针置NULL防止野指针先释放所有有效节点循环依次释放直到只剩尾节点单独释放尾节点释放哨兵头结点*head NULL清空外部指针。

相关新闻

5分钟搞定Vuforia开发许可证:Unity AR开发环境配置全攻略

5分钟搞定Vuforia开发许可证:Unity AR开发环境配置全攻略

1. 项目概述:为什么Vuforia开发许可证是AR项目的“身份证”?如果你刚开始接触Unity和增强现实(AR)开发,准备用Vuforia引擎大展拳脚,那么你遇到的第一个、也往往是最大的“拦路虎”,很可能不是复…

2026/8/8 7:03:54 阅读更多 →
什么?部署大模型要多少显存你都不知道?

什么?部署大模型要多少显存你都不知道?

虽然大模型出来有段时间了,但是依然有很多的开发者不知道如何下手去部署一个自己的本地模型, 甚至不知道,自己本地的资源适合部署什么模型 ,什么模型需要多少资源。今天我们就来讲讲这个常规的基础问题。 一个常见的误区: 很多人…

2026/8/8 7:03:54 阅读更多 →
2026年Java面试八股文新趋势与核心考点解析

2026年Java面试八股文新趋势与核心考点解析

1. 为什么2026年的Java面试依然需要八股文?最近帮团队面试了几个Java开发岗的候选人,发现一个有趣的现象:哪怕到了2026年,大厂技术面试依然保持着"八股文场景题"的经典组合。上周面了个五年经验的候选人,在回…

2026/8/8 7:02:53 阅读更多 →

最新新闻

还在手撕路径?三行代码搞定Java文件名,绝对路径秒变亲儿子

还在手撕路径?三行代码搞定Java文件名,绝对路径秒变亲儿子

Java程序可以通过以下方法从绝对路径中获取文件名:java.io.File;class Main {void main( args) { "/path/to/file.txt";File file new File(); file.();.out.("文件名:" );在上述提及的代码里, 我们先是制作出一个File对象, 把绝对…

2026/8/8 8:57:40 阅读更多 →
Linux:文件管理命令

Linux:文件管理命令

1 cd命令1.1进入指定目录./ 当前目录/ 根目录../ 当前目录下一个目录1.2进入家目录1.3 两个文件路径快速切换:cd -2 ls命令2.1 显示文件ls -a 显示隐藏ls -l 显示属性ls -F 显示目录 /可组合 ls -lFh 大小用k,kb表示2.2 显示文件详细信息2.2.1 文件类型2…

2026/8/8 8:57:40 阅读更多 →
从物理原理到工程实践:器件设计核心权衡与可靠性设计指南

从物理原理到工程实践:器件设计核心权衡与可靠性设计指南

1. 项目概述:一份提纲背后的工程思维重塑 最近在整理自己的知识库,翻出了当年学习“器件工程”时密密麻麻的笔记和复习提纲。我发现,无论是学生备考,还是工程师需要快速回顾某个半导体器件的核心原理,一份好的复习提纲…

2026/8/8 8:57:40 阅读更多 →
微信私域自动化:高效运营体系构建指南

微信私域自动化:高效运营体系构建指南

1. 微信私域自动化:从零构建高效运营体系私域流量运营已经成为企业营销的标配,而微信生态作为国内最大的社交平台,自然成为私域运营的主战场。但手动操作不仅效率低下,还容易出错。我团队经过两年实战,总结出一套完整的…

2026/8/8 8:57:40 阅读更多 →
Python招聘数据分析系统:从数据采集到可视化洞察的完整实战

Python招聘数据分析系统:从数据采集到可视化洞察的完整实战

1. 项目概述:从海量招聘数据中洞察行业脉搏 最近在帮一个做职业规划的朋友分析市场行情,他扔给我一堆从各大招聘网站爬下来的数据,Excel表格密密麻麻,看得人头晕。这让我想起自己刚入行那会儿,面对海量招聘信息&#x…

2026/8/8 8:57:40 阅读更多 →
Rocky操作系统的安装

Rocky操作系统的安装

目的为了在本地电脑中进行k8s相关实验的学习,现安装rocky操作系统同时将相应的步骤进行整理。一、操作系统的安装1.首先双击已经安装好的vmware软件,出现如下页面2.点击左上角的文件--新建虚拟机或者直接点击创建新的虚拟机3.选择典型,然后点…

2026/8/8 8:56:40 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →