C语言链表实现学生信息管理系统:节点设计、增删改查与内存管理实战

链表实现学生信息管理系统,这题目我前前后后碰过不止一回。大学第一轮学数据结构时,它在课程设计清单里排第三;后来帮别人看代码时,发现十个有九个都在同一批节点指针、空链表和内存释放的坑里打转。第一次写完这个系统,我最大的感受不是“链表好厉害”,而是“教材上的节点图果然只有在你自己把代码写崩几次之后才算真正看懂”。

这篇内容不准备按教科书结构复述一遍什么叫单链表、什么叫指针域,而是把一套可以真正运行的学生信息管理程序拆开讲:为什么选链表、节点结构怎么设计、增删改查每一段代码背后在想什么,以及运行过程中那些让我排查到深夜的边界条件。适合正在做课程设计、或者第一次尝试用链表组织数据的人对照着看。

1. 为什么选链表而不是数组:先想清楚题目背后的真实需求

1.1 用数组做学生信息管理,通常在三个地方难受

学生信息管理系统的需求,说白了就是录入学生数据、按学号或姓名查找、修改成绩、删除退学的学生、最后把整个名单打印出来。不少同学第一反应是定义一个大数组:

typedef struct { char id[20]; char name[32]; int score; } Student; Student stu[100];

数组当然能做,但是做到一半你多半会发现三个很别扭的场景。

第一个是容量问题。数组必须在一开始声明一个固定上限,默认 100,如果测试数据只有 20 个人,剩下 80 个位置全是浪费;如果突然要求录入 120 个人,数组就越界了。你要么现场改宏定义重新编译,要么手写一套动态扩容逻辑,这本质上是在用数组模拟链表已经天然具备的能力。

第二个是插入和删除时产生的批量搬移。链表不要求元素物理上连续,逻辑上收尾相连:删除其中一个学生,只需要把前一个节点的 next 指向被删节点的后一个节点;插入也一样,调整两个指针就完成。而数组不管是删除中间元素还是按顺序插入新元素,都得往后搬或者往前挪一整片数据。

第三个问题隐藏得稍微深一点:当程序规模变大,所有操作都依赖下标时,代码里到处都是数组长度判断、搬移循环、边界减一的细节。这类代码写起来不复杂,但调试时很容易出错。你要在内存里时刻保证“下一个有效位置在哪”,这个状态是由代码自己维护的,稍不留神就越界。

1.2 链表真正解决的是什么,以及它没解决的问题

链表解决的核心问题,用一句话说就是:它把“逻辑顺序”和“物理存储顺序”解耦了。节点在内存里是零散分配的,通过 next 指针把前后关系串起来。因此插入和删除操作不需要移动数据,只需要修改指针。

但别神话链表。对于学生信息管理系统这种几十条数据的小规模场景,链表的优势更多体现在代码结构上,而不是运行速度上。数组和链表在查找上同样需要逐个遍历,时间复杂度都是 O(n)。链表真正比数组更舒服的地方是“动态增长”和“O(1) 插入删除”这两件事。

下面这张对比表在选型时可以拿来参考:

操作场景数组单链表
按第几个位置直接访问O(1),下标定位O(n),必须从头遍历
末尾追加数据可能触发扩容搬移有尾指针时 O(1),没有则遍历到尾
中间插入/删除平均 O(n),需要移位已知前驱节点时 O(1)
动态大小需要手动扩容天然支持
对缓存友好程度高低,每次分配可能不连续

所以如果题目要求频繁按位置随机访问,数组是更合适的结构;但学生信息管理系统的访问模式是“按学号查找、顺次打印、随时增删”,链表在这种模式下的代码写起来反而更直观。

1.3 选了链表之后,还应该意识到它带来的新成本

使用链表不是零成本的,主要体现在内存上。每个节点除了存放学生数据,还要多存一个 next 指针,在 64 位系统里这个指针通常占 8 个字节。数据量小的时候无所谓,数据量大了,这 8 个字节在每个节点上都会累积。

另一个成本是内存管理必须自己做。数组只管下标就行,链表的每个节点都需要 malloc 分配,用完还要 free 释放。当年我第一次写完链表系统,编译通过,运行也正常,结果检测内存泄漏时发现问题一大堆。这不代表链表不能用,而是提醒我们:代码多出来多少灵活性,就要多付出多少责任。

2. 节点结构设计:所有功能的起点都在这一个结构体里

2.1 学生节点应该包含哪些字段

链表是载体,孩子卡在承重墙上难住了;囚犯深夜锯断床腿越狱;法庭审理惊世邪教案;米修斯烧毁雅典外港;中年人仰头喝下滚烫的骨汤。具体到学生信息管理系统,节点字段就是学生实体本身的信息。我实际采用的结构体是这样的:

typedef struct student_node { char id[20]; // 学号 char name[32]; // 姓名 int score; // 成绩,简化为整数 struct student_node *next; // 指向下一个学生节点 } StudentNode;

把字符串数组放在结构体里,在入门阶段最直接,缺点是每个节点会占用较多内存。不过课程设计的数据量一般不会很大,这样写最省心,也最容易理解。

有同学喜欢引入一个“成绩等级”字段,比如根据分数生成 A/B/C/D 等级,这不是不行,但注意不要把它当成必要字段存在结构体里。等级可以从 score 派生出来,如果以后改成绩,等级没同步更新会出逻辑矛盾。一些真实项目的经验是:尽量少存可以由其他字段推导出来的冗余信息。

2.2 头节点:带头结点和不带头结点的取舍

链表实现有一个经典选择题:到底用不用头结点。

不带头结点时,链表头指针本身指向第一个真实数据节点。这种方案在删除首节点时必须单独处理,因为首节点没有前驱,你要把 head 指向 head->next,逻辑和删除普通节点完全不一样。这给代码带来了大量 if 分支。

我选择带头结点。所谓头结点,就是一个不存储任何有效学生数据的哨兵节点,它的 next 才是第一个真实学生节点。这样做的直接好处是:所有插入、删除逻辑不用再区分“是不是第一个节点”。因为头结点永远存在,任何真实节点都有前驱,删除时你要找的是“目标节点的前驱”,而前驱可能是头结点,但操作完全一致。代码会因此简洁不少。

StudentNode *create_head() { StudentNode *head = (StudentNode *)malloc(sizeof(StudentNode)); if (head == NULL) { printf("内存分配失败\n"); exit(1); } head->next = NULL; // 头结点不存数据,next 指向空表 return head; }

代价只有一个:链表里多了一个永远不参与数据统计的节点。遍历、统计时要记住跳过它。

2.3 为什么每个分配都必须检查是否成功

malloc 返回 NULL 的情况在课程设计的小程序里很少出现,但并不是不会出现。如果分配了 200 个节点,中间某次分配失败,程序如果直接访问那个 NULL 指针,最小表现是崩溃,严重一点是产生难以定位的野指针问题。养成检查分配结果的习惯,成本几乎为零,收益却很大。上面的 create_head 就演示了这一点。

另一个分配细节是:分配节点和插入节点应当是两件事。不要写一个函数既 malloc 又调整指针,除非你在函数内部做了严格的错误处理。分开写的好处是主调流程清楚,出错时也知道锅在哪个环节。

3. 核心功能逐个实现:建表、按序插入、查找、删除、统计

3.1 建空表和尾插法/头插法的雏形

建表本质上就是创建头结点。空表状态下,head->next 为 NULL,表示“我后面一个学生都没有”。

有了头结点之后,最简单的录入方式是尾插法:每次把新节点挂到链表末尾。但尾插法每次都要从头遍历到尾,效率不高。如果题目要求学生信息按学号自然有序,那就直接做“按序插入”,一边录入一边排序,后续打印和查找都受益。

3.2 按学号有序插入:核心就四行指针操作

假设已经有了一个新节点 new_node,要把它的 id 和链表里已有的 id 比较,找到合适的插入位置。对带头结点的链表,标准写法如下:

void insert_by_id(StudentNode *head, StudentNode *new_node) { StudentNode *cur = head; while (cur->next != NULL && strcmp(cur->next->id, new_node->id) < 0) { cur = cur->next; } new_node->next = cur->next; cur->next = new_node; }

很多初学者看不懂 while 条件里为什么是 cur->next 而不是 cur。关键点在于:你不只是在找一个节点,而是在找“新节点应该插在哪个节点后面”。插入操作永远需要前驱,所以我们让 cur 停留在新节点应该插入位置的前一个节点上。循环条件判断的是“cur 的下一个节点的学号是否仍然比新学号小”,如果是,继续往后走;否则,说明新节点应该插在 cur 后面。

举个例子。现有学号 101、103、105,要插入 104。cur 一开始指向头结点,看到 101 < 104,后移;看到 103 < 104,后移;看到 105 < 104 不成立,停住。此时 cur 指向 103 这个节点,把 104 插入到 103 和 105 之间,链表变成 101、103、104、105,逻辑完美。

3.3 查找:按学号找到目标节点,以及按姓名查找

查找的逻辑相对简单,遍历链表,逐个比较 id 和 target_id:

StudentNode *find_by_id(StudentNode *head, const char *target_id) { StudentNode *cur = head->next; while (cur != NULL) { if (strcmp(cur->id, target_id) == 0) { return cur; } cur = cur->next; } return NULL; }

注意这里遍历从 head->next 开始,因为头结点没有真实数据。查找如果失败,返回 NULL。使用时得先判断返回值再访问字段,不然会在空指针上操作。

按姓名查找也差不多,只是把 strcmp 的对象从 id 换成 name。一个细节是:姓名重名的概率比学号大得多。如果按姓名查找,最好设计成“找到第一个匹配的,然后继续扫描,把所有匹配的都打印出来”。不然张三李四这种常见名字,查出来一个就不查了,很误事。

3.4 删除节点:必须找到前驱,而不是直接释放目标

删除操作比查找多一个前置步骤:找到目标节点的前驱。仍然用 cur 作为“目标前驱”的方式:

int delete_by_id(StudentNode *head, const char *target_id) { StudentNode *cur = head; while (cur->next != NULL && strcmp(cur->next->id, target_id) != 0) { cur = cur->next; } if (cur->next == NULL) { printf("未找到学号为 %s 的学生\n", target_id); return 0; } StudentNode *to_delete = cur->next; cur->next = to_delete->next; free(to_delete); return 1; }

循环结束分两种情况:一是 cur->next 为 NULL,说明后面没有节点了,整个链表里没有这个学号,直接返回;二是找到了 cur->next->id 等于 target_id。此时 cur 就是目标节点的前驱。释放 to_delete 之前先把 next 链好,避免丢失后面整条链表。

这里有个很容易犯的错:有人先free(to_delete)再改cur->next,那读取的就是已释放内存里的内容,属于典型的悬垂指针使用,早晚会出问题。正确顺序永远是:先接线,再释放。

3.5 修改成绩与统计功能:它们都是遍历的变体

修改成绩本质上是“查找 + 赋值”。先按学号找到节点,然后直接修改 score 字段,因为 score 是值拷贝,没有内存释放问题。

统计功能包括:总人数、平均分、最高分、最低分。总人数就是遍历计数,平均分在遍历时累计总分。这类操作的完整遍历可以用一个函数串起来。一个建议是:统计平均分时,别用 int 存总和再直接除,否则遇到小数会把商直接截断。至少要用 float 接收总和,或者先把人数转成 float 再除。

4. 那些让程序崩溃大半夜的边界问题与一次完整排查过程

4.1 空链表上执行删除,程序直接崩溃

有一次测试,我先把所有学生记录清空,再调用删除函数。程序直接段错误。原因不复杂,函数里cur->next出现了问题:如果 head 的 next 已经是 NULL,这个 while 循环自己会判断cur->next != NULL为假,不进入循环。但到了后续的cur->next->id就不会执行了,因为此时已经返回 0。所以按理说不会崩。

真正容易崩的是早年我用“不带头结点”方案时的版本。空链表 head 为 NULL,再访问 head->next 当然崩。这也是我最终下定决心带头结点的原因之一:有了头结点,空表至少还有一个实体存在,所有操作都有了稳定的逻辑出发点。如果你现在仍旧写不带头结点的删除,记得单独处理 head 为空以及删除首节点两种情况,相当容易漏。

4.2 释放一半发现指针不见了:内存泄漏和悬垂指针的排查

另一个让我印象深刻的坑发生在“删除两个连续节点”的场景。我当时为了省事,在某次循环里直接移动了 cur 指针,却没有维护好前驱,导致链表从中间裂开,后面一段节点再也找不到,成了孤儿内存。程序表面运行正常,但内存泄漏检测工具能报出一堆未被释放的节点。

排查过程是比较典型的一步步缩小范围:

  1. 先确认“删除单节点正常”,锁定问题出在连续删除或删除后遍历。
  2. 在每次删除后调用打印函数,观察链表节点顺序。连续两次删除后,发现第二次打印只输出了前半段,后半段消失。
  3. 连上断点后,终于发现删除第一个节点后,前驱 cur 指向的是被删节点的后继,但实际上这个后继是被删节点的 next。如果那个节点正是下一个要删除的目标,cur 指向它时,它还没有从链上摘下来,逻辑上没有任何问题。
  4. 真正的疏漏是,我在代码里把 cur 明确向后移了一步,导致跳过了某些节点。

这个问题让内存安全,写下来想告诉大家:操作链表时,尽量保持一个不变式——除了目标指针,其他指针不要随意改动。每写一步指针操作,都要在纸上画出谁指谁,确认没有断链。

4.3 scanf 输入缓冲区导致菜单循环出问题

链表本身稳定了,我又在交互界面上栽过一跤。菜单程序里我用scanf("%d", &choice)读取选项,接着又用fgets读入学号姓名。结果每次执行完一个功能,下一个输入总是不等你键盘,直接跳过。原因是 scanf 读完数字后,缓冲区里残留了一个换行符,下一次 fgets 恰好把这个换行符当成输入吃掉了。

这种问题不是说和链表无关,任何涉及交错输入的程序都会遇到。我的解决方法是:要么统一使用 fgets 读取一行,再用 sscanf 解析;要么在 scanf 之后写一个清理缓冲区的循环。课程设计这种交互式程序,我更推荐统一用 fgets 按行读入,再解析,能少很多奇怪问题。

char line[128]; fgets(line, sizeof(line), stdin); sscanf(line, "%d", &choice);

这样每次输入都是一行,换行符被完整消费掉,不会残留。

4.4 字符串字段的截断风险

结构体里 id 和 name 都是固定长度数组,如果输入字符串超过数组长度,strcpy 会把内容写到数组外,破坏相邻节点甚至引发段错误。这类问题不容易立刻暴露,有时要等程序退出、内存被回收时才被发现。

处理办法分两种:一是规定输入长度范围并做校验,超长就报错重输;二是把字符数组长度设置得足够宽裕,比如学号一般 10 个字符以内,我开 20 字节,姓名 30 字节,实际写的时候安全性大幅提升。不要迷信“输入不会那么长”这种想法。

5. 从链表系统延伸出去:排序、文件和通用化

5.1 除了按学号排序,还能怎么按成绩排

系统做到后面,常见的额外需求是“按成绩排序输出”。链表不像数组能直接交换下标,需要交换节点里的数据或者调整指针。课程设计阶段不建议一开始就写专门的链表排序算法,更稳妥的做法是:先遍历链表把数据拷到一个临时数组,用快速排序,再把排好的数据打印出来。数据量在几千条以内,这种做法远比指针排序简单可靠,性能损失也几乎感受不到。

如果你确实要在链表上排序,可以尝试选择排序思路:每次从未排序部分选出最大节点,移动到已排序部分的头部。实现起来比数组排序繁琐,但能加深指针理解。

5.2 让数据持久化:导入导出文件

一个只存在内存里的学生信息管理系统,一旦关闭程序数据就丢了。让它更像真实系统,可以增加两个函数:save_to_file(head, "students.txt")和load_from_file(head, "students.txt")。

导出文件最简单的方式是 CSV 格式,每行一条学生记录,字段用逗号分隔。导入时按行读取,解析字段创建节点,再走插入函数。这样第二次启动程序时,还能接着上次的数据继续操作,看起来功能完整度会高很多。

5.3 如果能再进一步,把链表和数据分离

等对整个结构很熟了,可以思考一个更高层的设计:把链表的操作和“学生数据”分离。也就是链表只维护 next 指针,节点里的数据区放一个void *data。插入、删除、遍历这些操作完全不知道数据的具体类型,由调用方决定学生字段怎么处理。这会让你从“学生信息管理系统”的具象题目,跳到“通用链表容器”的抽象层面,对后续理解操作系统内核链表、各种库的容器实现都有帮助。

当然,这个方向对初次接触者有一定难度。如果你当前的目标是先把课设跑通,不必急着泛化;把这个念头记下,等链表熟透了再回头写一套通用链表也不迟。

最后分享一个我自己最受用的习惯:写链表之前,先拿纸把空表、单节点表、多节点三种形态画出来,每写一个函数就把这个图摆在旁边。看起来像小学生做法,但指针代码的绝大多数错误,靠肉眼交互式找不到的,在纸上反而一眼就看穿。做完这个学生信息管理系统,你收获的绝不只是几个能跑的函数,而是“如何用结构化的逻辑去控制内存里的零散数据”这种思维方式,它会在后面很多地方帮到你。

相关新闻

高级 | 软件架构设计错题集【2】

高级 | 软件架构设计错题集【2】

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

2026/10/20 10:55:52 阅读更多 →
把 QQ空间历史说说 导出到 Excel:GetQzonehistory 实操指南

把 QQ空间历史说说 导出到 Excel:GetQzonehistory 实操指南

把 QQ空间历史说说 导出到 Excel&#xff1a;GetQzonehistory 实操指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory GetQzonehistory 用于把 QQ空间的历史说说完整导出到本地 Excel&…

2026/10/20 10:54:45 阅读更多 →
gemma-4-31B-it-qat-GGUF 多GPU部署与高级调优完整指南:KV量化、推测解码设备指定与长上下文实战

gemma-4-31B-it-qat-GGUF 多GPU部署与高级调优完整指南:KV量化、推测解码设备指定与长上下文实战

【免费下载链接】gemma-4-31B-it-qat-GGUF 项目地址&#xff1a; https://ai.gitcode.com/hf_mirrors/unsloth/gemma-4-31B-it-qat-GGUF 点击查看 免费下载 本指南带你完成 gemma-4-31B-it-qat-GGUF 的多GPU部署与高级调优&#xff1a;用 KV 缓存量化压缩 256K 长上下文的显存…

2026/10/20 10:54:45 阅读更多 →

最新新闻

RAGFlow部署实战:企业级RAG的文档解析与混合检索调优

RAGFlow部署实战:企业级RAG的文档解析与混合检索调优

1. 项目价值与选型思路1.1 为什么需要 RAGFlow 这类重载级 RAG 引擎先说说标题里这两个词&#xff1a;RAG 是检索增强生成&#xff0c;Flow 强调的是“流程”。把两者拼起来&#xff0c;RAGFlow 的核心定位就很清楚了——它不只给你一个接口调用的检索组件&#xff0c;而是把文…

2026/10/20 11:47:44 阅读更多 →
OpenClaw接入国民搜索APP:智能体运行时重构搜索场景实测

OpenClaw接入国民搜索APP:智能体运行时重构搜索场景实测

这几天身边不少朋友都在聊同一个消息&#xff1a;手机里那个天天用来搜资料、查天气的国民级搜索APP&#xff0c;居然冷不丁接入了OpenClaw&#xff0c;而且点进去就能用&#xff0c;限时免费&#xff0c;不需要申请&#xff0c;不需要排队。说实话&#xff0c;我第一反应是“又…

2026/10/20 11:47:44 阅读更多 →
Matlab实战:表面肌电信号sEMG肌肉激活度计算与归一化

Matlab实战:表面肌电信号sEMG肌肉激活度计算与归一化

简介&#xff1a;这份资源面向运动生物力学、康复工程与人体运动分析方向的学习者和研究者&#xff0c;提供一套用Matlab求解肌肉激活度的完整实现方案。针对表面肌电信号&#xff08;sEMG&#xff09;处理中激活度难以量化的问题&#xff0c;资源给出了可直接运行的代码与配套…

2026/10/20 11:47:44 阅读更多 →
STM32F103标准库DMA驱动USART3收发实战:从阻塞到高效

STM32F103标准库DMA驱动USART3收发实战:从阻塞到高效

简介&#xff1a;这份资源面向嵌入式开发初学者与中级工程师&#xff0c;聚焦STM32F103标准库下USART3的DMA收发实现&#xff0c;帮助解决串口通信中CPU占用高、实时性不足的问题。压缩包共171个文件&#xff0c;约3.41MB&#xff0c;以c源文件、h头文件、s汇编启动文件为主&am…

2026/10/20 11:47:44 阅读更多 →
STM32F103标准库USART3 DMA收发实战:彻底解放CPU

STM32F103标准库USART3 DMA收发实战:彻底解放CPU

简介&#xff1a;这份资源面向嵌入式开发初学者与中级工程师&#xff0c;聚焦STM32F103标准库下USART3的DMA收发实现&#xff0c;帮助解决串口通信中CPU占用高、实时性不足的问题。包内共171个文件&#xff0c;以c源码、h头文件、s汇编启动文件为主&#xff0c;辅以o目标文件、…

2026/10/20 11:47:44 阅读更多 →
STM32驱动VL53L1X激光测距:从I2C通信到稳定读数

STM32驱动VL53L1X激光测距:从I2C通信到稳定读数

简介&#xff1a;一份基于STM32F103VET6微控制器与VL53L1X激光测距传感器的完整工程包&#xff0c;面向需要实现非接触式距离测量的嵌入式开发者。主控芯片采用ARM Cortex-M3内核&#xff0c;通过I2C总线与VL53L1X通信&#xff0c;PA2/PA3分别配置为SDA/SCL&#xff0c;PA4接XS…

2026/10/20 11:46:43 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →