Releases: castoricelover777/datastruct-studio
Release list
数据结构研习社 v2.1.3 · 动画画面全面彻查(空格子、重叠标签、空屏)
数据结构研习社 v2.1.3 —— 按用户两次截图做的全面彻查
下载
DataStruct-Studio-2.1.3-portable.exe,双击即用。 无需安装,也无需装编译器(内置 TCC;系统有 gcc 时自动优先用 gcc)。
建议替换 2.1.2 或更早的版本 —— 这一版修掉了动画里一批「画面上看不出来、但确实不对」的问题。
内容仍是 25 / 25 节、188 个练习模块、188 段动画。
起因
用户连着截到两处:
05-04-02 TableSort:画面一排空框,字幕却写着「排完之后 table = [1, 3, 0, 2, 4]」02-04-02 InitQueue:front和rear两个标签叠在同一处,糊成一团
所以这次不抽查,按同一套口径把所有动画过了一遍。
新增审计工具 tools/audit-array-anims.js
拿场景模型和实际产物两边对账:
| 检查 | 内容 |
|---|---|
| ⓪ 连续空屏 | 所有 188 个场景沿时间轴取样,画面元素全不可见超过 1.2 秒就报(字幕和标注不算画面有东西) |
| ① 逐格核对 | 13460 次:模型说某时刻第 N 格该显示某值,产物在同一列上必须真有它、而且亮着 |
| ② 整排空框 | 和场景自身峰值比:曾经到过 ≥3 格、却有一连 ≥1 秒一格值都没有 |
| ③ 同格指针重叠 | 同一格上同时可见的指针标签会不会叠在一起 |
修掉的问题(8 处)
- InitQueue:
front/rear两个标签精确重叠。渲染器现在会把同格指针左右错开并补引出线,收益覆盖01-02-01、01-02-02等同类场景 - BSTDelete:树和 8 个结点的可见区间全是
[[5.6,12]]—— 前 5.6 秒(占 47%)整屏空白,而那段讲的正是「删叶子 / 只有一个孩子」,非要指着这棵树说 - InitList_Sq:只定义了下标 0/1 两格的「?」,画面是「一半问号一半空框」,讲「读到越界内存」时整排已空;现在六格都摆着,初始化之后也继续摆(呼应「数组一个字节没动」)
- QuickSort:第一行格子从 4.0 秒才开始,前一半是空屏 —— 而那 4 秒在讲边界和负下标
- NextPrime、06-02-08 main:开场各 2 秒没有东西可看
- freeList(单/双链表):释放完有 2.2 秒死画面 → 补一个「L = NULL」空表标记
- doubly main / FreeTree:结尾 2 秒空屏 → 相应结点留到结尾
- InfixToPostfix:
+在 5.0 秒就消失,而栈里明明是两个元素(+在底、*在顶),8.4 秒那句「弹出剩余的*和+」更是直接指着两格说
另外 lint-anim.js 加了一条防回归:同格指针错开后总宽超过「一格 + 余量」时报警。
自检状态
npm run verify 10738 项,0 失败
node tools/audit-array-anims.js 188 场景 / 13460 次逐格核对,0 问题
node tools/lint-anim.js 0 问题
node tools/lint-anim-loop.js 可见性 + keyTimes 合法性,0 问题
node tools/check-anim-semantics.js 文案与画面是否相符,0 处
桌面版 / 在线版 / 本 Release 三处产物同源,版本号都是 2.1.3。
数据结构研习社 v2.1.2 · 修复动画播到一半画面变空
数据结构研习社 v2.1.2 —— 修复「动画播到一半,画面整段变空」
下载
DataStruct-Studio-2.1.2-portable.exe,双击即用。 无需安装,也无需装编译器(内置 TCC;系统有 gcc 时自动优先用 gcc)。
如果你已经装了 2.1.0 / 2.1.1,建议换这一版 —— 那一版的动画有全局性缺陷:播到中途元素会整段消失。
内容仍是 25 / 25 节、188 个练习模块、188 段动画。
问题:动画播到一半,格子/文字整段消失
有用户截图报 05-04-02 TableSort:画面是一排空框,字幕却写着「排完之后 table = [1, 3, 0, 2, 4]」—— 值明明该在,画面上却没有。
查下去这不是一个场景的问题,而是188 段动画全中。
根因:动画的 keyTimes 越界了
场景定义里到处用 vis: [[0, 99]] 表示「这个元素从头到尾都在」。那个 99 是哨兵值,不是秒数。渲染器拿它直接算淡出时刻,于是写出了这样的动画:
<animate attributeName="opacity" values="1;1;0"
keyTimes="0.0000;8.2383;8.2500" dur="12s"/>8.2383 就是 99/12。而 SMIL 规范要求 keyTimes 落在 [0, 1] —— 越界之后这项动画就成了坏数据,浏览器的表现是元素在正片放到 2/3 时整段消失,剩下的时间画面是空的。
实测(用 git 取出上一版产物逐个解析):
| keyTimes 越界处数 | |
|---|---|
| v2.1.1(旧) | 310 处 |
| v2.1.2(本版) | 0 处 |
修法
- 结束时刻超出总时长的元素一律视为「活到循环结尾」:淡入之后一直亮到结尾,停在 opacity=1,循环回开头也接得上,不会闪
- 出口再加一道保险:keyTimes 统一夹进 [0,1],出现非有限值直接抛错
- 顺带修掉「循环末尾闪空」:以前 1990 个元素都在循环末端淡出,现在该常驻的常驻
新增防回归检查 tools/lint-anim-loop.js
判定方式是模型 vs 产物:场景模型说某格在某时刻该显示,就把产物里那个元素的 opacity 动画按 SMIL 语义解码,要求那时真的亮着;另外硬查 keyTimes 必须在 [0,1] 且单调不减。
这个检查自带 --self-test(先用一段已知坏的动画证明判定逻辑有效),也可以传一个目录去查别的产物 —— 拿上一版的故障产物喂给它,它准确报出 30 处,确认它不是一条永远绿灯的死检查。
自检状态
npm run verify 10738 项,0 失败
node tools/lint-anim-loop.js 动画可见性 + keyTimes 合法性,0 问题
node tools/lint-anim.js 188 段动画,0 问题
node tools/check-anim-semantics.js 文案与画面是否相符,0 处
node tools/lint-quotes.js 0 处
桌面版 / 在线版 / 本 Release 三处产物同源,版本号都是 2.1.2。
数据结构研习社 v2.1.1 · 动画文案与画面对齐
数据结构研习社 v2.1.1 —— 动画「文案与画面」对齐
下载
DataStruct-Studio-2.1.1-portable.exe,双击即用。 无需安装,也无需装编译器(内置 TCC;系统有 gcc 时自动优先用 gcc)。
内容仍是 25 / 25 节、188 个练习模块、188 段动画(与 v2.1.0 相同)。这一版不动内容,只修看得见的问题:动画里「文字说的」和「画面做的」对不上,以及一个会让产物每次重建都变的隐患。
一、新增语义核验工具,修掉 8 处「文案和画面对不上」
lint-anim 只能扫机械问题(空画面、越界、文字重叠)。这一版加了 tools/check-anim-semantics.js:把每个步骤时间点的真实画面抽成快照(每格显示什么值、高亮哪几个),再和文案声称的动作对照。
全量 72 个格子阵列场景 / 642 个步骤跑出 40 处可疑,逐条判定后修掉 8 处真问题:
| 模块 | 原来是什么样 |
|---|---|
| InsertionSort | 画面里第 6 格从 4.0 秒起凭空消失,最终停在 1 2 3 5 8 · —— 文案却喊「结果 1 2 3 4 5 8」,等于画面上根本没有 8 |
| Partition | 5.0 秒起第 5、6 格消失,画面成了 · · · 8 5 · ·,一半数组不见了 |
| BubbleSort | 文案「8 和 3:交换」在 5.0 秒,格子到 5.4 秒才动;「结果 1 2 3 4 5 8」在 11.0 秒,最终排列到 12.0 秒才成形 |
| HeapSort | 交换那句在 4.2 秒、格子 5.0 秒才动;结果那句在 13.0 秒,画面还是 3 2 1 4 5 8 |
| PercDown | 4.0 秒的文案说「1 在下标 1、孩子是 5 和 3」,可那一刻 1 刚被 8 换走 —— 文案和画面在说两个状态 |
| ShellSort / main / RadixSort | 结果句提前到画面排完之前 |
顺带把「讲原理的步骤」和「描述当前动作的步骤」在工具里区分开,误报从 40 处收到 0。
二、画布加高 300 → 340,标注文字终于有落脚处
原来 300px 里要塞七层(格子、下标、说明箭头虚线、箭头文字、字幕、代码行、进度条),标注文字放哪儿都盖住别人。加高 40px 之后每层各占一行:
40 标题 · 63 副标题 · 104~150 格子 · ~163 下标
182 箭头虚线 · ~197 箭头文字 · 210 标注 · 250 字幕 · 276 代码行 · 308 进度条
三、修掉「产物每次重建都变」的隐患
链表那一节的 driver 把头结点未初始化的 data 打印进了预期输出。那个值是 malloc 给的随机内容 —— 实测它会从 -244228128 变成 21716960。也就是说每跑一次 npm run data,产物都会变,桌面版和在线版显示的数字还不一样。现在只说明「读它就是未定义行为」,不再打印具体数值。
四、其它修复
- 两个 typedef 动画(单链表 / 双链表)的引出线和标注一直在画面外:
render.js从来没导出场景要用的几何常量,MID静默变成NaN - 清掉一个孤儿 SVG(场景改名后留下的旧产物,一直挂在 Pages 上)
- 在线版侧边栏版本号从
v2.0.0-web对齐到v2.1.1-web - 字幕里的
**强调**现在真的渲染成粗体(原来会把星号画出来) - 排序动画的初始数组补上(原来打开播放器会看到一排空框)
自检状态
npm run verify 10738 项,0 失败
node tools/lint-anim.js 188 段动画,0 问题
node tools/check-anim-semantics.js 0 处不符
node tools/lint-quotes.js 0 处
桌面版 / 在线版 / 本 Release 三处产物同源,版本号都是 2.1.1。
数据结构研习社 v2.1.0 · 25 节全部完成
数据结构研习社 v2.1.0 —— 陈越《数据结构》25 节全部完成
下载
DataStruct-Studio-2.1.0-portable.exe,双击即用。 无需安装,也无需装编译器
(内置 TCC;系统有 gcc 时自动优先用 gcc)。
从 v2.0 的 7 节扩到 25 节,把 03 树、04 图、05 排序、06 散列四章补齐。
内容覆盖(25 / 25 节,188 个练习模块、188 段动画)
| 章 | 节 | 模块 · 动画 |
|---|---|---|
| 01 引论 | 算法复杂度 / 最大子列和(O(n³)→O(n) 四算法) | 9 · 9 |
| 02 线性结构 | 线性表 / 链表(单链表 13 + 双链表 15)/ 堆栈 / 队列 / 应用实例 | 46 · 46 |
| 03 树 | 二叉树基础 / 二叉搜索树 / AVL 四种旋转 / 堆 / 哈夫曼树 / 并查集 | 54 · 54 |
| 04 图 | 图的表示 / DFS·BFS / Dijkstra / Prim·Kruskal / 拓扑排序 | 29 · 29 |
| 05 排序 | 冒泡·插入·希尔 / 堆排序·归并 / 快速排序 / 表排序·基数排序 | 28 · 28 |
| 06 散列 | 散列函数设计 / 开放地址法(线性·平方·双散列)/ 分离链接法 | 22 · 22 |
从 02-03 到 06-03 的每一节都用同一套模板:标注源码 + 真 gcc 跑出来的预期输出 + 至少一段动画。
这一版新增的两个渲染器
动画原来只有"结点 + 箭头"和"格子阵列"两种画法。树和图的内容加进来之后补了两个:
- 树渲染器:中序遍历定列号、深度定行号 —— 画出来的二叉树天然不会左右打架,
也符合纸上的习惯画法;行距按深度自适应(4 层的树不会画出画面) - 图渲染器:顶点坐标由场景直接给出(图没有"天然"布局,与其猜一个,
不如照要讲的那张图摆位置);支持有向边箭头、权值标注、顶点角标(dist / 入度 / 平衡因子)
顺手修掉的几个通用缺陷
写这四章的过程里暴露出几个藏在工具链里的问题,都修在了源头上:
| 问题 | 修法 |
|---|---|
| 函数索引只认模块的 key —— 一个模块里定义了多个函数时,只有 key 对应的能被依赖推断认出来 | 解析器现在会把模块代码里定义的所有函数名都映射到该模块 |
NextPrime 上界太小 —— MAXTABLESIZE = 1000 让 NextPrime(1000) 直接返回了非素数 1001 |
改成先从 N 本身检查,上界提到 20000 |
| 中文里误敲 ASCII 双引号 —— 这个坑前后踩了六次,每次都表现为莫名其妙的 C 语法错误 | 新增 tools/lint-quotes.js,只扫真正的代码行(会跟踪跨行块注释状态) |
| 树渲染器 4 层就画出画面 | 行距改为按深度自适应(36~62px) |
自检
npm run verify → 检查项 10550 个,失败 0 个
覆盖:
- 三档注释的代码部分逐字节相同(这是 v1.0 以来的核心保证)
- 精简档不比详细档长
- 每个练习模块都必须配动画
- 预期输出必须由真 gcc 跑出来(不是编造的)
- 动画关键帧时间递增、不超出总时长、每帧都有名字和说明
- 依赖不悬空、覆盖清单与章节树对得上
- 逻辑代码行里不允许出现误用的引号
冷启动实测 209~223 ms(PRD 要求 < 3s)。
在线版
https://castoricelover777.github.io/datastruct-studio/
和桌面版共用同一套渲染层(一层浏览器 shim 实现桌面版的 IPC 接口),
三层树、三档注释、默写、diff、动画播放器、代码联动全都在。
唯一差别:浏览器里没有 C 编译器,状态栏会如实显示「Web 版 · 无法编译」。
说明
- 未知的
.exe会被 Windows SmartScreen 拦一下,选「仍要运行」即可(未做代码签名)。 - 数据保存在
%APPDATA%\DataStruct Studio\,卸载软件不影响草稿。 - 从 v2.0 升级不会丢进度(草稿和"已通过"记录是按模块 id 存的,id 没变)。
数据结构研习社 v2.0.0 · DataStruct Studio
数据结构研习社 v2.0.0 —— 从「链表工具」升级为「数据结构平台」
按 PRD v2.0 完成平台化升级。下载 DataStruct-Studio-2.0.0-portable.exe,双击即用,
无需安装,也不需要装编译器(内置 TCC;系统有 gcc 时自动优先用 gcc)。
这一版的核心变化
| 能力 | 说明 |
|---|---|
| 三层导航树 | 章 → 节 → 模块;章可折叠且记忆状态;搜索 applist / AVL / BFS 直接定位;模块右侧有 未学 / 默写中 / 已通过 状态标签 |
| 动画播放器 | 进度条可拖动(按下即跳、画面实时跟随)、0.5x~2.0x 变速、单步、循环、关键帧圆点(悬停显示步骤名)、空格与 , . 快捷键 |
| 代码 ↔ 动画联动 | 动画播到哪一句,右侧代码就高亮哪一行并滚进视野;点代码行则动画跳到对应步骤 |
| 链表大模块 | 单链表 / 双链表 / 对比 三视图,对比视图标出双链表多出来的 prior 相关行 |
| 自定义测试输入 | 编辑区下方「输入」tab,内容会喂给程序 stdin |
| 数据层 JSON 化 | data/ 目录,按章懒加载,冷启动只读一个很小的 tree.json |
内容覆盖(7 / 25 节,55 个练习模块,55 段动画)
| 节 | 模块 | 动画 |
|---|---|---|
| 01-01 算法复杂度 | 4 | 4 |
| 01-02 最大子列和(O(n³) → O(n) 四算法对比) | 5 | 5 |
| 02-01 线性表(顺序表) | 6 | 6 |
| 02-02 链表(单链表 13 + 双链表 15) | 26 | 26 |
| 02-03 堆栈 | 5 | 5 |
| 02-04 队列(循环队列) | 5 | 5 |
| 02-05 应用实例(中缀转后缀 + 求值) | 4 | 4 |
树 / 图 / 排序 / 散列 四章的骨架(章色带、三层树、数据 schema)已全部就位,
补内容只需写标注源码 + 写场景再构建。
每段动画既能在 README 里播放,也能被拖动的做法
动画数据仍是 SVG 内联 SMIL —— 所以放进 README 用 <img> 引用照样自动播放;
应用里把它内联进 DOM 后,用 SVG 原生的 pauseAnimations() / setCurrentTime(t)
做随机访问,于是拖动、变速、单步都成了"改一个时间变量"。一套数据,两种消费方式。
自检
npm run verify → 2645 项检查,0 失败。包含:三档注释逐字节一致、
脚手架带「轮到你了」标记、预期输出非空、每个练习模块必须配动画、
动画关键帧时间递增且不越界、SVG 无 NaN 且含动画元素、依赖不悬空等。
冷启动实测 209~223 ms(PRD 要求 < 3s)。
在线版
https://castoricelover777.github.io/datastruct-studio/
在线版和桌面版共用同一套渲染层(用一层浏览器 shim 实现桌面版的 IPC 接口),
三层树、三档注释、默写、diff、动画播放器、联动全都在。
唯一差别:浏览器里没有 C 编译器,状态栏会如实显示「Web 版 · 无法编译」。
说明
- 未知的
.exe会被 Windows SmartScreen 拦一下,选「仍要运行」即可(未做代码签名)。 - 数据保存在
%APPDATA%\DataStruct Studio\,卸载软件不影响草稿。
LinkList Studio v1.0.0 —— 链表代码解剖与默写训练
下载
单文件便携版,双击即用、无需安装,并且自带编译器 —— 机器上没装 gcc 也能直接编译运行。
➡ LinkList-Studio-1.0.0-portable.exe(96 MB · Windows 10/11 x64)
这是什么
一个专注 "识别 ≠ 生成" 这个痛点的链表训练工具:能看懂链表代码,合上书本却写不出来。
用 分模块阅读 → 去注释裸看 → 空白默写 → 一键编译验证 的闭环,把基础积木练成肌肉记忆。
内置两本互相独立的教材
| 教材 | 内容 |
|---|---|
| 单链表 | 12 个模块 + 完整源码:类型定义、创建结点、初始化、尾插、头插、按位/按值查找、按位插入、按位删除、遍历、释放、main 测试 |
| 双向链表 | 14 个模块 + 完整源码:增删查改齐全(含按位修改与反向遍历),并重点讲双向特有的坑 |
两本教材的参考代码、练习草稿、进度、上次看到哪完全隔离,侧栏顶部随时切换。
主要特性
- 三档注释(详细 / 精简 / 无注释)由同一份参考代码生成,代码行逐字节一致 —— 只剥注释,不动代码结构,结构上不可能写歪
- 可运行的练习脚手架:自动扫描测试驱动、沿调用图补齐依赖函数,中间留出默写空白;填完
Ctrl + Enter立刻看到运行结果 - diff 对比:与官方实现逐行比对,标出
-漏写 /+多写 /~写法不同 - 编译器:优先调用系统 gcc,检测不到时自动启用内置 TCC
- 完整源码一键运行:模块 15/13 本身就是完整程序,可直接跑起来看效果
- 浅色 / 深色主题;编译错误红色显示、点行号直接跳转;深色用户启动不会闪白屏
双向链表教材讲的是什么
它不是单链表的复制粘贴,每个模块都在讲"双向"特有的坑:
- 头插:空表时
s->next->prior是空指针取成员,照抄单链表头插必崩 - 按位插入:四根指针各自的作用(①③ 指出去、②④ 指回来),以及为什么②必须判空
- 按位删除:体现双向链表真正的价值 —— 单链表删除必须从头找前驱,双向链表定位到第 i 个结点后用
p->prior就够了 - 反向遍历:终止条件为什么是
p != L而不是p != NULL
测试驱动专门覆盖两个最容易崩的分支:空表头插和删尾结点,并且每次改动都同时打印正向和反向互为校验。
使用提示
- 便携版首次启动会解压到临时目录,比安装版慢一两秒,属正常现象
- 设置与练习草稿存放在
%APPDATA%\LinkList Studio,删掉即彻底清理(删 exe 就等于卸载) - 快捷键:
←→切换模块,123切换三档注释,Ctrl + Enter编译运行
从源码构建
npm install
npm start # 开发态运行
npm run verify # 自检(对两本教材共 74 项检查)
npm run dist # 打包成单文件便携 exe自检会验证三档模式的代码一致性、完整源码的编译与运行输出、
以及每个模块的脚手架填上答案后逐个编译并运行成功。详见 README。