單鏈表是動態資料結構的基礎,透過指標將分散的節點串聯。本文從零建立節點結構、串聯列印、插入操作,並對比陣列優劣勢。
typedef struct Folder {
int level;
char *filename;
struct Folder *child; // 必須用結構標籤,因類型尚未定義完成
} Folder;
struct Folder *child 形成遞迴引用,是鏈表的核心。
int main() {
Folder first = {1, "first", NULL};
Folder second = {2, "second", NULL};
Folder third = {3, "third", NULL};
first.child = &second;
second.child = &third;
// 遍歷列印
for (Folder *p = &first; p != NULL; p = p->child) {
printf("%s level is %d\n", p->filename, p->level);
}
return 0;
}
輸出:
first level is 1
second level is 2
third level is 3
Folder fourth = {4, "fourth", NULL};
second.child = &fourth;
fourth.child = &third;
// 原: first → second → third
// 新: first → second → fourth → third
插入只需調整兩個指標,O(1) 時間,無需移動資料(陣列需 O(n) 位移)。
| 操作 | 陣列 | 單鏈表 |
|---|---|---|
| 隨機存取 | O(1) 透過索引 | O(n) 需遍歷 |
| 頭部插入/刪除 | O(n) 位移 | O(1) 改頭指標 |
| 中間插入/刪除 | O(n) 位移 | O(1) 找到前驅後改指標 |
| 記憶體佔用 | 緊湊,無額外開銷 | 每節點額外指標開銷 |
| 快取友好 | 連續記憶體,預取優 | 分散記憶體,缺頁多 |
| 動態擴容 | 需重新分配複製 | 自然支援 |
靜態建立節點受限於作用域,實務中配合 malloc/free 管理堆上節點,見下一篇「malloc 與 free 實戰」。