直擊本質:程式 = 資料結構 + 演算法
C 語言**無內建高階容器**(無 `vector`、`map`、`list`、`set`、`dict`)。每一個非平凡專案,你都得**親手實作或挑選適合的資料結構**:
- 動態陣列 → `realloc` 增長策略、記憶體對齊、擴容觸發點
- 鏈表 → 單/雙向、哨兵節點、無鎖佇列、內核 `list_head`
- 雜湊表 → 桶陣列、開鏈/開放定址、負載因子、擴容遷移、鑰匙比較函式
- 樹 → 二元搜尋樹、AVL/紅黑樹、B+ 樹、Trie、區間樹
- 圖 → 鄰接表/矩陣、拓撲排序、最短路徑、最小生成樹
- 堆/優先佇列 → 二元堆、配對堆、Fibonacci 堆
**不懂資料結構,C 寫不出任何有價值的系統軟體。**
資料結構訓練的三重核心能力
- 抽象建模:將現實問題(路由、快取、索引、排程)映射為抽象結構(圖、LRU、B+樹、堆)。
- 記憶體與效能權衡:C 迫使你面對——
陣列:連續、快取友善、插入刪除 O(n)
鏈表:離散、指標開銷、插入刪除 O(1)
雜湊:平均 O(1)、最壞 O(n)、記憶體膨脹、哈希函式品質
樹:有序、O(log n)、指標豐富、快取未命中多
**沒有銀彈,只有場景適配。**
- 工程落地功力:邊界條件、記憶體洩漏、雙重釋放、併發安全、持久化序列化、跨平台對齊——這些只能在「手寫資料結構」的反覆踩坑中內化。
學習路徑建議
- 入門:《大話資料結構》(程杰)或《資料結構與演算法分析:C語言描述》(Weiss)—— 代碼可編譯、講解接地氣。
- 進階:《演算法導論》(CLRS) 精讀核心章節 + 用 C 實作習題。
- 實戰:閱讀開源專案核心資料結構實作:
- Linux kernel: `include/linux/list.h`, `rbtree.h`, `radix-tree.h`, `idr.h`
- Redis: `sds.h` (動態字串), `dict.c` (漸進式 rehash 雜湊), `skiplist.c` (跳表)
- nginx: `ngx_array_t`, `ngx_queue_t`, `ngx_rbtree_t`, `ngx_hash_t`
- SQLite: B+tree 實作 (`btree.c`)
- LevelDB/RocksDB: MemTable (SkipList), SSTable (Block + Bloom Filter)
- 專題:自己實作一個「迷你 Redis」或「嵌入式 KV 引擎」,涵蓋網路協定、事件迴圈、資料結構、持久化、備份恢復。
常見誤區
「C++ 有 STL,學 C 還要手寫資料結構嗎?」
**必須手寫**。STL 容器是「黑盒」,不懂底層原理無法:
✅ 選擇正確容器(`vector` vs `deque` vs `list`)
✅ 解決效能瓶頸(迭代器失效、記憶體碎片、快取未命中)
✅ 除錯核心傾印(看懂 `_M_impl._M_start` 等內部佈局)
✅ 面試通過「手寫 LRU/跳表/紅黑樹」高頻題
結語
資料結構不是考試科目,是**C 程式設計師的內功心法**。花半年系統攻克,終身受用。跳過它,C 只能寫「玩具程式」;攻克它,C 寫出「基礎設施」。