CalcGuide · 技术博客主页 / 一页纸学习计划
🔥极高

C 语言与数据结构算法:一页纸学习计划

分类:编程语言 · 路径:docs/topics/c-language-data-structures-algorithms/README.md

#c#algorithms#systems#beginner-friendly

用 12~16 周从零基础学到独立完成迷宫寻路或管理系统

父主题

顶层主题

子主题(0)

C 语言与数据结构算法:一页纸学习计划

学习路线

C 语言语法
  → 函数、数组、字符串
  → 指针、结构体、动态内存
  → 复杂度分析与递归
  → 链表、栈、队列
  → 排序与查找
  → 树、堆、哈希表
  → 图、DFS、BFS
  → 贪心、分治、回溯、动态规划
  → 综合项目与算法题训练

每一步都是下一步的前置;不要跳级、不要并行学多个阶段。

阶段周数分配(12~16 周,量力而行)

阶段12 周方案16 周方案备注
1. C 基础1.5 周2 周含 Day 1~7 任务
2. 指针与内存1.5 周2 周必须配合画内存图
3. 递归与复杂度1 周1.5 周复杂度思想需要消化
4. 线性结构2 周2.5 周链表是重头戏
5. 排序与查找1.5 周2 周五种排序 + 二分
6. 树与哈希1.5 周2 周BST / 堆 / 哈希
7. 图算法1.5 周2 周DFS / BFS / Dijkstra
8. 综合算法1 周1 周分类与状态转移
9. 综合项目0.5 周1 周含 README 与复盘

12 周方案对应每天满负荷、每天 12 小时投入;16 周方案对应每周 8 小时、更稳。选 12 周时建议每周留 1 天复盘。

九阶段:核心知识、实践产出、可观察学会标准

阶段核心知识实践产出可观察学会标准
1. C 基础类型、运算符、输入输出、条件、循环、函数、数组、字符串学生成绩统计程序(多函数 + 多组测试)不看资料能写出能跑的程序,能解释每个函数的输入输出
2. 指针与内存指针运算、数组与指针关系、结构体、malloc/free、野指针与泄漏动态通讯录(增删改查 + 文件持久化)能画出每个变量的内存布局,能解释每次 malloc 对应的 free
3. 递归与复杂度递归调用栈、时间复杂度 O 表示、空间复杂度阶乘、斐波那契、汉诺塔能用递归树推导复杂度,能把递归改写为迭代版本
4. 线性结构顺序表、单链表、双链表、栈、队列、循环队列链表实现 + 括号匹配程序能独立写出入队、出栈、插入、删除四种操作并测试边界
5. 排序与查找冒泡、插入、选择、快排(含 partition)、归并(分治思想)、二分查找排序比较工具(输出每种排序耗时与步骤数)能独立写出 5 种排序和二分;能说清归并是分治范式;能手写快排 partition 并讲清平均 O(n log n) 与最坏 O(n²) 的触发条件(基准选择)
6. 树与哈希二叉树、三种遍历、二叉搜索树、堆、哈希表(冲突处理)文件目录树或哈希通讯录能手写插入与遍历,画出哈希冲突的解决过程
7. 图算法邻接矩阵、邻接表、DFS、BFS、Dijkstra(最短路径,含基础版与堆优化)迷宫或地图寻路小程序能用 DFS 和 BFS 分别解决同一问题并比较结果;知道 Dijkstra 基础版 O(V²) 适用条件(V 小、稠密图、无负权);知道堆优化版 O((V+E) log V) 适用条件(V 大、稀疏图、无负权)
8. 综合算法分治、贪心、回溯、动态规划(背包、最短路径、棋盘)至少 4 道题,每题记录思路与状态转移能说出每种范式的适用场景,能写出状态转移方程
9. 综合项目需求分析、模块划分、测试、文档、复盘一个可编译运行的 C 项目(见下文)第三方能按 README 编译运行,作者能讲清每个模块的设计取舍

第一周(每天 1.5~2 小时)

Day 1 编译约定:本计划统一使用 C11。编译命令:gcc -std=c11 -Wall -Wextra source.c -o program。所有源码从 Day 1 起就遵守 C11;当你已经能稳定写出无警告代码,再叠加 -Werror -pedantic 作为进阶检查。

任务当天交付
Day 1装 gcc / clang + VS Code,写出 hello world、读命令行参数;用 gcc -std=c11 -Wall -Wextra 编译一份编译运行笔记(含完整命令)
Day 2变量、基本类型、scanf/printf、算术运算写一个温度转换小程序
Day 3if/elseswitch、布尔表达式写一个简单计算器(加减乘除 + 错误处理)
Day 4for/while/do-while、循环控制写九九乘法表和素数判断
Day 5函数定义、参数传递、返回值、作用域、头文件拆分把前面的小程序改写成多文件
Day 6一维数组、二维数组、string.h 常用函数写字符串反转、统计单词数
Day 7学生成绩统计项目:读取多名学生成绩,输出平均分、最高分、最低分、及格人数;拆分为 read_scores / compute_stats / print_report 三个函数一份可编译运行的源码 + 一份测试记录

Day 7 项目执行次序(避免一次堆叠)

零基础 Day 7 任务量大,按以下次序分两步推进;每一步独立可验证。

步骤 A —— 先打通最小可用版本(预计 60~90 分钟)

  1. 实现 read_scores:从 stdin 读取若干个浮点数,遇到非数字或 EOF 结束;返回数组与元素个数;
  2. 实现 compute_stats:基于数组计算平均分、最高分、最低分、及格人数(≥ 60);
  3. 实现 print_report:按统一格式打印四项结果;
  4. 用 1 组正常数据(例如 5 名学生:80 75 90 60 55)跑通;
  5. gcc -std=c11 -Wall -Wextra stats.c -o stats 编译;零警告即通过。

步骤 B —— 按清单补齐 4 类边界 / 异常用例(预计 30~45 分钟)

在前一步基础上,按下面清单逐步补足测试,并记录到 notes/week1-day7.md

#用例期望行为
B1空输入(直接 Ctrl+D)给出友好提示,不崩溃
B2仅 1 人成绩(如 100平均=100,最高=最低=100,及格=1
B3全不及格(如 40 30 20 50平均、最高、最低、及格人数=0 全部正确
B4异常输入(混入 -5abc负数拒绝并提示;非数字拦截并提示

进阶检查(非首次门槛):当步骤 A、B 都稳定通过、且你能解释每个警告含义时,再叠加 -Werror -pedantic 编译,确认无警告可升级。Day 7 当天不必完成此步。

阶段通用验收(每一阶段都必须通过)

  1. 不看答案独立重写核心代码;
  2. 用自己的话解释该知识“解决什么问题、为什么有效”;
  3. 画一张图:内存布局 / 节点关系 / 算法执行过程;
  4. 测试空数据、最小值、最大值、异常输入;
  5. 准备至少 3 组自定义数据并贴出实际输出;
  6. 记录时间复杂度和空间复杂度;
  7. 能修改已有程序(加功能、修 bug、调性能),而不是只能照抄。

交付存放:第 3 项的图、第 5 项的输出截图 / 文本、第 6 项的复杂度推导,统一存到当前阶段对应项目目录的 notes/ 或 README 章节,例如阶段 4 链表的笔记写在 stage4-linked-list/notes/。不要散落在聊天记录或临时文件里,便于后续复盘与综合项目引用。

最终验收(学完全部九阶段后)

综合项目

首选:迷宫寻路(必做:控制台输入迷宫并输出路径坐标/地图)。
备选:通讯录图书管理系统(文件存储 + 哈希/树索引 + 增删改查)。

迷宫寻路必做要求:

notes/ 与 README 存放规范

所有“画图(内存 / 节点 / 执行过程)”和“贴输出”类交付物统一存放在项目根目录的 notes/ 子目录或 README 的对应章节;提交时一并带上,避免散落在聊天或临时文件里。综合项目的 notes/ 至少包含:

任何综合项目都必须包含:

  1. 需求说明:要解决的问题、用户故事、输入输出约定;
  2. 数据结构选择理由:为什么用这个结构,时间/空间复杂度如何;
  3. 核心算法说明:关键函数伪代码或流程图;
  4. 模块化源码.h / .c 分文件,函数职责单一;
  5. 边界测试:空输入、极端输入、非法输入都有处理;
  6. 编译说明Makefile 或清晰的 gcc 命令,注明依赖;
  7. README:项目介绍、运行步骤、目录结构、复盘(踩过的坑、可改进点);
  8. 复盘记录:用时、难点、收获、下一步。

推荐开源资料(按角色分工,避免堆链接)

阶段角色资料链接用法
1~2C 语言入门菜鸟教程 C 语言https://www.runoob.com/cprogramming/c-tutorial.html中文友好,覆盖语法 + 小例子,适合零基础
1~2C 语言查阅cppreference Chttps://en.cppreference.com/w/c仅供查阅:查标准库函数签名、关键字语法;不替代入门教程
3+主线解释Hello 算法https://www.hello-algo.com/数据结构 / 算法概念入门,图解 + 伪代码
7~8算法进阶OI Wikihttps://oi-wiki.org/DFS / BFS / 贪心 / DP / 图论查漏补缺
4 之后C 源码对照a46554/c-algorithmshttps://github.com/a46554/c-algorithms自己实现链表后再读,对照风格
4 之后C 源码对照The Algorithmshttps://github.com/TheAlgorithms/看成熟实现,补工程细节
5+可视化Algorithm Visualizerhttps://github.com/algorithm-visualizer/algorithm-visualizer观察算法执行过程,验证理解
4+题目练习洛谷https://www.luogu.com.cn/中文题库,入门到省选
5+题目练习力扣中国https://leetcode.cn/面试导向,分专题练习

许可证提示:从 a46554/c-algorithms、The Algorithms 等开源仓库复制或参考源码前,必须先打开其 LICENSE 文件确认许可证类型(MIT / Apache-2.0 / GPL 等)。GPL 类代码用于商业 / 闭源项目前请逐条阅读;MIT/Apache 在保留版权声明的前提下通常可直接使用。默认做法是读思路后自己重写,而不是复制粘贴。

源码阅读时机:GitHub 源码对照资料放到“阶段 4(线性结构)之后”再读。原因是:前 3 阶段目标是建立“从需求到代码”的独立实现能力;过早读成熟源码会变成抄写而非理解。阶段 4 之后你已经能写链表,此时读对照资料才有意义。

默认使用顺序:先用菜鸟教程 / Hello 算法建立概念 → 用 cppreference 查阅(非通读)语法 → 自己用 C 独立实现 → 用 Algorithm Visualizer 验证 → 阶段 4 后读 a46554/c-algorithms 和 The Algorithms 对照 → 在洛谷/力扣做题巩固 → 写复盘到 notes/retrospective.md

常见误区

所有知识点分类(统一规则)

后续新增主题时按此归类,再套用一页纸模板;一个主题可有一个主分类和一个辅助分类。本计划归属见最末行。

  1. 编程语言:C、Java、Python、JavaScript 等
  2. 数据结构与算法:排序、查找、图、DP 等
  3. 计算机基础:OS、网络、数据库、组成原理等
  4. 工程技术:Git、Linux、Docker、测试、CI/CD 等
  5. Web 与后端:HTTP、REST、Spring Boot、数据库开发等
  6. 前端与客户端:HTML/CSS、JavaScript、React、移动开发等
  7. 数据与人工智能:SQL、机器学习、深度学习、数据分析等
  8. 项目与职业能力:软件设计、调试、代码规范、技术写作等

本计划:编程语言(C) 主 + 数据结构与算法 辅。


学习资料汇聚(v0.3)

本节是主题文件自包含的最后一节;不再依赖 notes/ 子目录。补足内容直接写在本节内,缺失处标 “由本计划生成”。外部图片或大型标准文档以链接 / 附件形式挂在本节。

由本计划生成 / Generated by this plan(本节内容基于公开资料的整理与示范;非第三方讲解的复制)。

9.1 背景与动机

9.2 概念地图

核心概念(≥5):

flowchart LR
    源文件((源文件 .c))
    头文件[(头文件 .h)]
    预编译[预编译]
    编译[编译]
    汇编[汇编]
    链接[链接]
    可执行[可执行文件]
    类型[类型系统]
    表达式[表达式]
    控制流[控制流]
    函数[函数]
    指针[指针]
    内存[内存管理]
    数组[数组]
    字符串[字符串]
    结构体[结构体]
    库[标准库 / 第三方库]
    源文件 --> 预编译
    头文件 --> 预编译
    预编译 --> 编译 --> 汇编 --> 链接
    库 --> 链接
    链接 --> 可执行
    类型 --> 表达式
    表达式 --> 控制流
    控制流 --> 函数
    函数 --> 指针
    指针 --> 内存
    指针 --> 数组
    数组 --> 字符串
    类型 --> 结构体

关系说明:

9.3 基础知识讲解

主推(评分 ≥4,零基础友好;示范文件可超出 1~2 个上限,正式主题建议 ≤2):

资料角色评分链接
菜鸟教程 C 语言零基础中文入门4https://www.runoob.com/cprogramming/c-tutorial.html
Hello 算法 C 语言部分概念图解4https://www.hello-algo.com/
cppreference C查阅手册4https://en.cppreference.com/w/c
Beej’s Guide to C Programming进阶英文讲解4https://beej.us/guide/bgc/

备查(评分 3):

资料角色链接
CS50 C 课程视频讲解https://cs50.harvard.edu/x/
OI Wiki C 基础简明语法回顾https://oi-wiki.org/
Learn-C.org互动练习https://www.learn-c.org/

缺失部分:本计划不重写第三方资料;如读者在“指针与内存”阶段仍卡住,请按 §9.4 中的段错误清单逐条排查。

9.4 经典问题与经典案例

#问题为什么会重要最简答案
1段错误(Segmentation fault)90% 零基础第一周会遇到检查空指针解引用、数组越界、栈溢出
2内存泄漏(Memory leak)长时间运行程序会逐渐耗尽内存每次 malloc 都对应 free;用 valgrind 验证
3悬空指针(Dangling pointer)free 后再使用指针会读垃圾数据释放后将指针置 NULL
4printf 格式串与参数不匹配会读栈上随机数据,可能输出乱码或崩溃启用 -Wall -Wextra,编译器会告警
5整数溢出32 位 signed 超过 2^31−1 后变负数<stdint.h>int32_t;做边界检查
6头文件重复包含编译时间膨胀、符号重定义使用 #ifndef FOO_H / #define FOO_H / #endif 守卫
7main 返回值语义0 表示成功;非 0 表示失败,shell $? 依赖它int main(void) 显式 return 0
8函数指针用途实现回调、状态机、跳转表int (*op)(int,int) = add; 然后 op(2,3);
9C 与 C++ 在链接上的差异C 名称不修饰;C++ 会 name manglingC 函数给 C++ 用需 extern "C"
10scanf 缓冲区遗留换行下一次 gets/fgets 会读到空行getchar() 消耗换行,或改用 fgets

9.5 学习难点

概念难点

难点为什么会卡突破路径
指针 vs 引用C 没有引用,只有“指针+解引用”int *p = &x; 画三栏:变量 / 地址 / 值
数组与指针的等价与不等价大多数场景下等价,但 sizeof 不同在纸上写 a &a *a 三个值,比较大小
栈 vs 堆局部变量在栈,malloc 在堆画函数调用栈,标出每帧的变量;用 malloc 后写回收单

思维难点

难点为什么会卡突破路径
递归调用栈展开脑子装不下多层调用用“递推 + 回溯”两步拆;先写终止条件
复杂度从代码反推不会算循环嵌套的复杂度数循环层数 × 每次代价;画递推式
状态机思维算法题经常要记“当前状态”先画状态转移图,再写代码

工程难点

难点为什么会卡突破路径
多文件组织Makefile 第一次写容易乱先用单文件通过;再拆 .h/.c;最后加 Makefile
编译警告解读一开始看不懂 unused variable每次警告都去查;用 -Wall -Wextra 当老师
调试器使用gdb 第一次接触很陡学会 b / r / n / s / p 五个命令够 80% 场景
链接错误排查undefined reference 难定位看头文件声明 vs 源文件定义;检查 -l 参数

9.6 技术标准与接口

9.6.1 Entity

名称版本发布组织状态许可证 / 可访问性
ISO/IEC 9899:2011C11ISO/IEC JTC1/SC22 / WG14正式收费;草案公开于 open-std.org
ISO/IEC 9899:2018C17同上正式,缺陷修复同上
ISO/IEC 9899:2024C23同上正式,最新同上
POSIX.1-2017IEEE Std 1003.1-2017IEEE / The Open Group正式全文公开于 opengroup.org
GNU C Library (glibc)持续更新GNU Project事实标准LGPL
musl libc持续更新musl 项目嵌入式/轻量首选MIT

9.6.2 Scope

9.6.3 Structure

9.6.4 Ecosystem

9.6.5 Depth Tiers

层级名称必须看到什么
L0知道存在知道 C 有 ISO 标准;知道 C11/C17/C23 三个常见版本
L1看得懂示例教程中看到 <stdio.h> / <stdlib.h> 不陌生
L2能正确调用能按 <stdlib.h> 文档写出 malloc / printf / fopen
L3能解释与排错能解释段错误常见原因、errno 与返回值的含义
L4能设计与扩展能基于 C 标准为嵌入式场景裁剪 libc

本计划目标:阶段 9 综合项目时达到 L3

9.6.6 Source

引用

直接依赖(1)

查看知识图谱 · 热度 🔥极高