Skip to content

Releases: castoricelover777/datastruct-studio

数据结构研习社 v2.1.3 · 动画画面全面彻查(空格子、重叠标签、空屏)

Choose a tag to compare

@castoricelover777 castoricelover777 released this 15 Sep 14:26

数据结构研习社 v2.1.3 —— 按用户两次截图做的全面彻查

下载 DataStruct-Studio-2.1.3-portable.exe,双击即用。 无需安装,也无需装编译器(内置 TCC;系统有 gcc 时自动优先用 gcc)。

建议替换 2.1.2 或更早的版本 —— 这一版修掉了动画里一批「画面上看不出来、但确实不对」的问题。

内容仍是 25 / 25 节、188 个练习模块、188 段动画


起因

用户连着截到两处:

  1. 05-04-02 TableSort:画面一排空框,字幕却写着「排完之后 table = [1, 3, 0, 2, 4]」
  2. 02-04-02 InitQueuefrontrear 两个标签叠在同一处,糊成一团

所以这次不抽查,按同一套口径把所有动画过了一遍。

新增审计工具 tools/audit-array-anims.js

场景模型实际产物两边对账:

检查 内容
⓪ 连续空屏 所有 188 个场景沿时间轴取样,画面元素全不可见超过 1.2 秒就报(字幕和标注不算画面有东西)
① 逐格核对 13460 次:模型说某时刻第 N 格该显示某值,产物在同一列上必须真有它、而且亮着
② 整排空框 和场景自身峰值比:曾经到过 ≥3 格、却有一连 ≥1 秒一格值都没有
③ 同格指针重叠 同一格上同时可见的指针标签会不会叠在一起

修掉的问题(8 处)

  • InitQueuefront / rear 两个标签精确重叠。渲染器现在会把同格指针左右错开并补引出线,收益覆盖 01-02-0101-02-02 等同类场景
  • BSTDelete:树和 8 个结点的可见区间全是 [[5.6,12]] —— 前 5.6 秒(占 47%)整屏空白,而那段讲的正是「删叶子 / 只有一个孩子」,非要指着这棵树说
  • InitList_Sq:只定义了下标 0/1 两格的「?」,画面是「一半问号一半空框」,讲「读到越界内存」时整排已空;现在六格都摆着,初始化之后也继续摆(呼应「数组一个字节没动」)
  • QuickSort:第一行格子从 4.0 秒才开始,前一半是空屏 —— 而那 4 秒在讲边界和负下标
  • NextPrime06-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 · 修复动画播到一半画面变空

Choose a tag to compare

@castoricelover777 castoricelover777 released this 15 Sep 13:31

数据结构研习社 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 · 动画文案与画面对齐

Choose a tag to compare

@castoricelover777 castoricelover777 released this 15 Sep 13:08

数据结构研习社 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 节全部完成

Choose a tag to compare

@castoricelover777 castoricelover777 released this 15 Sep 05:09

数据结构研习社 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 = 1000NextPrime(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

Choose a tag to compare

@castoricelover777 castoricelover777 released this 14 Sep 23:18

数据结构研习社 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 verify2645 项检查,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 —— 链表代码解剖与默写训练

Choose a tag to compare

@castoricelover777 castoricelover777 released this 12 Sep 12:04

下载

单文件便携版,双击即用、无需安装,并且自带编译器 —— 机器上没装 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 就等于卸载)
  • 快捷键: 切换模块,1 2 3 切换三档注释,Ctrl + Enter 编译运行

从源码构建

npm install
npm start        # 开发态运行
npm run verify   # 自检(对两本教材共 74 项检查)
npm run dist     # 打包成单文件便携 exe

自检会验证三档模式的代码一致性、完整源码的编译与运行输出、
以及每个模块的脚手架填上答案后逐个编译并运行成功。详见 README。