数据结构与算法分析C语言参考答案:链表反转、快排与哈希实战解析
简介面向计算机专业学生与编程自学者《数据结构与算法分析C语言描述第四版》的参考答案与配套源代码打包为zip共100个文件约4.65MB。其中63个cpp为算法实现22个h为接口头文件12个docx为习题解答与学习笔记并附txt与html说明文档目录按章节组织便于对照教材逐模块查阅。内容覆盖数组、链表、栈、队列、散列表、二叉树与图等数据结构以及快速排序、归并排序、DFS/BFS、Dijkstra最短路等经典算法包含RadixSort、MaxSumTest、KdTree、SuffixArray、WordLadder等典型代码可直观理解C/C的指针操作、内存管理与复杂度分析。已有643人学习下载适合备考复习、笔试面试或自学提升通过阅读源码与习题解析既能夯实实现细节也能学会评估算法效率进而设计更优雅的解决方案。1. 为什么你需要一份「看得懂、跑得通」的参考答案很多人下载《数据结构与算法分析C语言描述第四版参考答案》后的第一反应是拷进编辑器、编译、看输出然后背下来。结果一到考试或面试换个问法就直接翻车。这份参考答案真正的价值不是给你一份可以照抄的“标准输出”而是它展示了教材作者在边界条件、空间换时间、递归转迭代时的判断逻辑。它适合三类人期末冲刺的学生、准备笔试的求职者、把数据结构当基本功来练的从业者。我接下来从一个一线使用者的角度把这份答案里最值得读的几段拆开讲清楚并告诉你哪些地方连答案自己也容易踩坑。2. 答案里的链表与递归先吃透这两个高频考点的判断标准2.1 单链表反转的三指针写法为什么参考答案不递归链表反转是这份答案里出镜率最高的题之一也是很多人的第一个“玄学”现场明明逻辑看懂了自己一写就段错误。参考答案里最常见的是三指针迭代写法#include stdio.h #include stdlib.h typedef struct Node { int data; struct Node *next; } Node; /* 三指针迭代反转单链表 */ Node* reverse_list(Node *head) { Node *prev NULL; Node *curr head; Node *next; while (curr ! NULL) { next curr-next; /* 先保存下一个节点否则改指向后就丢了 */ curr-next prev; /* 反转当前节点的指针域 */ prev curr; /* prev 前进一步 */ curr next; /* curr 前进一步 */ } return prev; /* prev 最终指向新链表的头 */ }逻辑上就四件事保存后继、反转指向、前驱前进、当前前进。这里最容易写错的是顺序——如果先执行curr-next prev再取next后继节点就找不到了链表当场断掉。所以代码里next curr-next必须放在最前面。为什么答案普遍选迭代而非递归单链表反转的递归版虽然代码更短但每一层递归都要占用栈空间反转 n 个节点就是 O(n) 的额外空间三指针迭代只用了三个临时变量空间 O(1)。在面试场景里考官让你“反转链表”通常默认要迭代版因为递归版的空间开销和栈溢出风险都属于减分项。你读答案时如果看到递归版可以把它当作练手但笔试建议写迭代版。判断一个“参考答案”质量高不高就看它有没有处理空链表和单节点链表。上面这段代码对head NULL和只有一个节点的情况天然安全循环不执行直接返回原头。很多网传的“精简版”答案会在这一行省掉next指针的声明或者在 while 里少一个判空输入一空就崩。你拿到答案后先跑这三个用例空链表、单节点、普通多节点能全过的再往下读。2.2 二叉树求高度递归基与返回值写法二叉树相关的参考答案里递归题占了大头。递归的关键就两条递归基写对、返回值含义想清。看这道经典题——求二叉树高度typedef struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; } TreeNode; /* 返回以 root 为根的子树高度空树高度为 0 */ int tree_height(TreeNode *root) { if (root NULL) return 0; /* 递归基空节点高度为 0 */ int left_h tree_height(root-left); int right_h tree_height(root-right); return (left_h right_h ? left_h : right_h) 1; /* 加上当前层 */ }这段代码的返回值含义是“从当前节点到叶子节点的最大边数”。递归基选的是空节点返回 0那么每一层向上 1最后根节点的高度就是正确值。如果把递归基改成if (root NULL) return -1叶子节点的高度就从 0 变成 0-1 1也能工作但含义变成了“节点数”而非“边数”判断标准要跟着变。这就是参考答案里最值得读的地方同一个题可以有不同约定答案选用哪种约定你必须从返回值推导出来而不是死记。常见翻车点是递归基漏写或写成if (root NULL) return 1。前者栈溢出后者所有高度都偏大。更隐蔽的是把左右子树递归调用顺序写反——对求高度没有影响但对中序、后序这类依赖遍历顺序的题就全错了。读答案时建议先圈出递归基再看返回值最后看递归调用顺序三步走完再看整体逻辑。2.3 复杂度分析怎么判断答案是不是“最优解”参考答案不等于最优解这是很多人没想明白的。教材正文讲的是思路习题答案给的是其中一种可行实现不一定是时间或空间上的最优。看答案时养成一个习惯先估算它的时间复杂度和空间复杂度再对照题目要求判断是否足够。拿链表反转来说迭代版时间 O(n)、空间 O(1)就是最优递归版时间 O(n)、空间 O(n)能过但不优。再看求二叉树高度递归版时间 O(n)因为每个节点访问一次空间是 O(h)h 是树高——如果树退化成链表空间就是 O(n)。如果你拿到一份答案的递归版二叉树高度但题目还额外要求“非递归实现”那这份答案就不算完整。用这个标准去筛你会发现网上流传的“第四版答案精简版”里至少有三分之一不是最优实现。我一般会按这个顺序看答案先读题预估复杂度和思路再看答案代码确认数据和指针操作最后用复杂度公式检验答案是否满足题目约束。如果答案代码和你的预估差出一个量级多半是答案本身选了笨办法或者题目存在特殊限制比如要求原地操作、要求稳定排序。这种差异反而是最好的学习素材——它逼你去想“作者为什么这么写”而不是简单地抄。3. 排序与哈希的答案对照边界条件比算法本身更重要3.1 快速排序的分区边界轴值选择与端点收缩快速排序是这份答案里翻车率最高的题目。很多人背了分区代码但一写就死循环问题基本都出在边界收缩上。参考答案里常见的是这种写法void quick_sort(int a[], int low, int high) { if (low high) return; /* 区间为空或只有一个元素 */ int pivot a[(low high) / 2]; /* 取中间值为轴 */ int i low, j high; while (i j) { while (a[i] pivot) i; /* 左边跳过比轴小的 */ while (a[j] pivot) j--; /* 右边跳过比轴大的 */ if (i j) { int t a[i]; a[i] a[j]; a[j] t; i; j--; /* 交换后收缩避免死循环 */ } } quick_sort(a, low, j); quick_sort(a, i, high); }这里最关键的参数是轴值选法和循环条件i j。轴值选中间位置(low high) / 2对基本有序的数据比较友好退化概率比固定选 low 低很多。分区循环用i j保证交换后两端同时收缩否则当a[i] pivot且a[j] pivot时交换完既不推进也不退出就会死循环——这是快排最常见的翻车现场。递归边界也值得细看分区结束后左边的区间是[low, j]右边是[i, high]。为什么不是[low, i-1]和[i, high]因为当a[i]恰好等于 pivot 时i 可能停在 pivot 右侧第一个位置用low, i-1会漏掉元素。参考答案里的low, j和i, high是经过反复验证的安全边界抄的时候不要自由发挥。一个判断答案合不合理的快速方法自己构造一份全是相同元素的数组比如 10 个 5。正确的快排应当能正常结束并保持全 5 顺序不稳定也不要求顺序而错写的分区会在第一轮就陷入死循环。所有快排答案都应该先用这个用例测一遍。3.2 哈希表的分离链接实现散列函数与冲突处理参数哈希相关习题在第四章后半部分集中出现。参考答案用的冲突处理最常见的是分离链接法拉链法代码结构通常是#define HASHSIZE 101 /* 表长取素数减少聚集 */ typedef struct HashNode { int key; struct HashNode *next; } HashNode; typedef HashNode **HashTable; /* 散列函数正整数取模 */ unsigned hash(int key) { return (unsigned)key % HASHSIZE; } /* 插入头插法新节点挂在链表头部 */ void insert(HashTable table, int key) { unsigned idx hash(key); HashNode *p (HashNode *)malloc(sizeof(HashNode)); p-key key; p-next table[idx]; /* 头插法O(1) */ table[idx] p; } /* 查找遍历链表 */ int find(HashTable table, int key) { unsigned idx hash(key); HashNode *p table[idx]; while (p ! NULL) { if (p-key key) return 1; p p-next; } return 0; }参考答案里值得细扣的参数有三个。第一是HASHSIZE取 101 这种素数目的很简单如果表长是合数而 key 的分布恰好和表长的因子重合数据就会扎堆到某几个槽位上冲突率飙升。第二是散列函数用% HASHSIZE它要求用 unsigned 取模避免负数 key 取模时出现索引越界。第三是插入用头插法因为它 O(1)而尾插法需要遍历链表效率差一个量级。读这份答案时注意一个细节find和insert里的 hash 函数被调用了两次每次都要做一次取模运算。在大规模数据下这是可优化的地方——把 hash 结果缓存到变量里只算一次。参考答案不缓存是因为教材阶段更强调逻辑清晰而非微优化。面试时如果你能主动指出这点并改写通常比背原答案效果好得多。哈希表的复杂度分析比代码本身更重要平均情况下插入和查找都是 O(1)但最坏情况是所有 key 都冲突退化成链表复杂度变成 O(n)。参考答案的链表方式是防止退化最简单的手段它不要求你处理复杂的开放定址法只要求把冲突挂在链上。这也是大多数考试和面试默认的实现值得完整背诵。4. 把这些答案跑起来老 C 代码的编译与最小测试环境4.1 用 GCC 编过老版 C 答案代码的两个关键参数很多参考答案是从教材配套代码整理来的写的是老式 C 风格跟你本地的默认编译标准不一致。最常见的现象是代码逻辑没问题但一编译就报错错误信息还特别长。这就是 C 语言标准差异导致的。gcc -stdc9x -Wall -Wextra -g -o test test.c解释一下这几个参数的作用-stdc9x让 GCC 接受 C99 标准。很多答案代码在for循环里声明变量如for (int i 0; ...)这是 C99 才引入的语法而 GCC 默认用的gnu17理论上也支持但某些老代码混用//注释和 KR 风格声明时会触发兼容问题用-stdc9x能减少这类误报。-Wall -Wextra打开全部警告答案代码里常见的未使用变量、隐式类型转换都会在这时现形。-g加上调试信息后面分析段错误用得上。如果编译时遇到的是“隐式声明函数”这类报错多半是漏了头文件检查#include而不是去改函数名。如果遇到error: for loop initial declarations are only allowed in C99 mode说明你的编译器默认标准太老把-stdc9x加上就能过。这个参数组合是我试过最省事的不需要改答案代码本身。还有一个小习惯把编译命令里的输出名-o test固定下来然后用./test直接跑。别用默认的a.out因为一个目录里多个实验程序时容易覆盖你最后根本分不清跑的是哪个版本。4.2 写一个驱动测试函数验证答案行为拿到一段参考答案别急着瞪眼看逻辑先给它包一个测试驱动。以刚才的快排为例最简驱动长这样#include stdio.h void quick_sort(int a[], int low, int high); /* 答案的函数声明 */ int main(void) { int a[6] {3, 1, 4, 1, 5, 9}; int n 6; quick_sort(a, 0, n - 1); for (int i 0; i n; i) printf(%d , a[i]); printf(\n); return 0; }测试驱动的价值在于把“我觉得它是对的”变成“它跑出来是对的”。这里我建议准备三组输入普通乱序数组、已经有序的数组、全部相同的数组。普通乱序验证基本功能有序数组验证快排在近乎有序时的表现劣质轴值选择会在这里退化全相同数组验证会不会死循环。三组都通过这段答案才算真正在你的环境里跑通。跑测试时观察的是输出但真正要留意的是程序是否“卡住”。如果全相同数组跑了几秒还没结束直接CtrlC中断然后去检查分区代码里的i和j--是否在交换后执行。这是快排最常见的死循环来源——交换后不收缩两个指针永远追不上。测试驱动不能告诉你复杂度问题但它能最快暴露这种致命逻辑错误。5. 参考答案的五个常见坑从编译失败到内存泄漏5.1 编译与运行层面的三个坑第一个坑C89 与 C99 的标准冲突。现象代码看起来没问题编译报for loop initial declarations are only allowed in C99 mode。原因参考答案写于早期用的是 C89 风格变量声明必须放在块开头而你本地的编译器或编辑器默认可能不是纯 C99。解决编译命令加-stdc9x或把循环变量声明提前到函数开头不修改答案逻辑。第二个坑段错误。现象编译过了一运行就直接Segmentation fault连输出都没有。原因大概率是指针操作越界常见于链表和树相关代码——访问了空指针的成员。解决先检查所有malloc后面有没有判空再检查递归/循环的出口条件。判别方法是用gdb跑gdb ./test输入run崩溃后输入bt它会直接告诉你崩在哪一行这比一行行读代码高效得多。第三个坑内存泄漏。现象答案函数被循环调用几万次后内存占用不断上涨最后程序被系统杀掉。原因参考答案为了演示逻辑很多链表、树的例子只做malloc不写free这在单次运行里看不出来但一旦嵌入循环就暴露。解决不是去改答案而是写测试驱动时自己包一层释放函数。这也是血泪经验——我见过有人拿答案里的插入函数做性能测试数据量一到百万级就 OOM最后发现是每次插入的新节点从不释放。5.2 答案内容本身的信任问题第四个坑习题编号对不上。现象按题号翻答案翻遍整个文档找不到对应题目。原因教材不同印刷批次对习题做了重排网上流传的答案文档多半基于旧版。解决不要按题号找按章节和函数名找。比如你要找“就地反转链表”直接搜reverse比搜“3.10 题”靠谱得多。这个坑几乎是每个用答案的人都会撞上的不是你的问题是版本漂移。第五个坑网传答案缺边界处理。现象答案代码能跑通教材里的示例数据但换一组输入就崩或者结果不对。原因很多人手打的答案为了省事把while (curr ! NULL)这种判空去掉或者省略了空表处理。解决拿到答案后先做一遍“空输入测试”——空链表、空树、长度为 0 的数组能撑过这三个用例的答案才算可靠。如果发现某份答案只有核心逻辑没有边界处理别直接抛弃把它当作“思路参考”自己动手补全边界。6. 一个验证技巧用随机测试与复杂度观测确认答案真伪验证参考答案的最高效手段不是点几个测试用例而是写一个随机数据驱动同时观察运行时间的增长趋势。正确性用断言检查复杂度用计时判断两者结合就能把网上流传的“错版答案”筛出来。#include stdio.h #include stdlib.h #include time.h void quick_sort(int a[], int low, int high); int main(void) { srand(time(NULL)); for (int n 1000; n 100000; n * 10) { int *a malloc(n * sizeof(int)); for (int i 0; i n; i) a[i] rand(); clock_t start clock(); quick_sort(a, 0, n - 1); clock_t end clock(); /* 正确性检查排序后必须非递减 */ int ok 1; for (int i 1; i n; i) if (a[i - 1] a[i]) { ok 0; break; } double sec (double)(end - start) / CLOCKS_PER_SEC; printf(n%d ok%d time%.4fs\n, n, ok, sec); free(a); } return 0; }看时间的增长比例数据从 1000 涨到 100000规模扩大 100 倍。真正的快排是 O(n log n)时间大约增长 100 × (log100000 / log1000) ≈ 167 倍如果时间几乎翻了 100 倍或更高说明它实际是 O(n²) 的劣质实现——很多网传答案在这里现形。我之前就遇到过一份“快排答案”小数据测试全对复杂度一测原形毕露数了一下比较次数才确认它其实写成了冒泡排序。从那以后我养成了一个习惯所有排序、查找类答案先跑随机测试再跑重复值测试最后看时间曲线。这个习惯救了我不少次希望帮到你。本文还有配套的精品资源点击获取

相关新闻

JavaSwing+MySQL医院预约挂号系统源码实战:从表设计到并发防超卖

JavaSwing+MySQL医院预约挂号系统源码实战:从表设计到并发防超卖

简介:基于Java Swing和MySQL的医院预约挂号系统源码包,面向计算机相关专业学生及Java桌面应用开发者,以MVC架构完整呈现医院预约挂号流程,涵盖用户管理、医生管理、科室管理和挂号预约等业务模块,可帮助读者快速理解Ja…

2026/10/10 9:26:06 阅读更多 →
基于图异常检测的自闭症脑功能连接分析方法

基于图异常检测的自闭症脑功能连接分析方法

简介:本资源是一项面向人工智能与机器学习方向研究者及高年级本科生的ASD(自闭症谱系障碍)辅助诊断实践项目,聚焦图异常检测等前沿机器学习方法在神经影像分析中的应用,依托公开ABIDE功能磁共振数据集开展建模与验证。…

2026/10/10 9:26:06 阅读更多 →
微信小程序+SSM+Mysql景区导览系统:从架构设计到联调避坑全解析

微信小程序+SSM+Mysql景区导览系统:从架构设计到联调避坑全解析

简介:这套基于微信小程序与SSM框架及Mysql数据库的乌鲁木齐景区导览系统毕业设计资料包,面向需要完成JavaWeb类课程设计或期末大作业的本科生及高职学生。内容完整梳理了景区浏览、语音讲解、热门推荐、地图导览、后台数据管理等核心模块,从游…

2026/10/10 9:26:06 阅读更多 →

最新新闻

Django+Vue外卖点餐系统毕设指南:从建表到联调全流程

Django+Vue外卖点餐系统毕设指南:从建表到联调全流程

简介:一套基于Python Django与Vue.js开发的外卖点餐系统毕业设计项目,采用B/S架构,适合计算机相关专业学生作为毕业设计或课程设计参考。前端覆盖首页、菜品详情、订单中心、用户中心等核心用户场景;后台提供总览、订单管理、菜品…

2026/10/11 13:14:52 阅读更多 →
如何在 Virtual Mac 上 5 分钟装好 macOS:新手保姆级快速上手教程

如何在 Virtual Mac 上 5 分钟装好 macOS:新手保姆级快速上手教程

【免费下载链接】VirtualMacOniPad People have dreamed of running macOS on iPad for more than a decade. Today, that dream comes true. With Virtual Mac, iPad finally breaks free from iPadOS, enabling pro apps like Xcode, Terminal, Final Cut Pro, Logic Pro, an…

2026/10/11 13:14:52 阅读更多 →
Kubernetes弹性伸缩实战:HPA、VPA与Cluster Autoscaler原理与配置

Kubernetes弹性伸缩实战:HPA、VPA与Cluster Autoscaler原理与配置

这两年只要跟Kubernetes沾边的团队,几乎都会聊到弹性伸缩。我这些年在一线折腾过不少集群,从最早以为加个 HPA 就万事大吉,到后来被线上抖动、扩容滞后和成本账单来回折磨,才算是把这一整套机制吃透。Kubernetes弹性伸缩实际上不是…

2026/10/11 13:14:52 阅读更多 →
Kubernetes弹性伸缩实战:HPA、VPA、CA与KEDA解析

Kubernetes弹性伸缩实战:HPA、VPA、CA与KEDA解析

做 Kubernetes 这行绕不开的话题就是弹性伸缩。很多人觉得只要部署到集群里,流量大了自然就能扩容,结果一到促销或者突发流量就被报警轰醒,才发现 Pod 数量没有动,节点也快被打满了。原因很简单,Kubernetes 的弹性伸缩…

2026/10/11 13:14:52 阅读更多 →
把CIContext存进@State?SwiftUI-Agent-Skill的“状态即缓存“高级技巧解析

把CIContext存进@State?SwiftUI-Agent-Skill的“状态即缓存“高级技巧解析

【免费下载链接】SwiftUI-Agent-Skill SwiftUI agent skill for Claude Code, Codex, and other AI tools. 项目地址: https://gitcode.com/GitHub_Trending/swi/SwiftUI-Agent-Skill 点击查看 免费下载 SwiftUI-Agent-Skill(技能名 SwiftUI Pro&#x…

2026/10/11 13:14:52 阅读更多 →
健身动作错误归因数据集:专注关节抖动、遮挡漂移与小目标定位

健身动作错误归因数据集:专注关节抖动、遮挡漂移与小目标定位

简介:本资源是面向计算机视觉开发者与运动健康AI研究者的健身动作关键点检测专用数据集,聚焦于自下而上类动作识别与姿态评估,解决健身动作自动判别、姿势纠错与虚拟教练系统构建等核心问题。数据集共1758张真实场景图像(含训练/验…

2026/10/11 13:13:51 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →