核心概念釐清
| 術語 | 定義 |
| 頭指針 | 指向鏈表第一個結點(頭結點)的指針 |
| 頭結點 | 首元結點之前的附加結點,數據域存放表長等輔助信息,不存有效數據 |
| 首元結點 | 鏈表中第一個存放有效數據的結點 |
| 尾元結點 | 最後一個有效結點,指針域為 NULL |

尾插法創建流程
- 動態分配頭結點,
pHead、pTail 均指向它
- 置
pTail->next = NULL
- 輸入結點個數
len
- 循環
len 次:
- 讀取數據
val
- 分配新結點
pNew,填充數據
pTail->next = pNew 掛鏈
pNew->next = NULL
pTail = pNew 移動尾指針
- 返回
pHead

完整代碼實現
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *pNext;
} NODE, *PNODE;
PNODE create_list(void) {
int len, i, val;
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if (!pHead) { printf("分配失敗!\n"); exit(-1); }
PNODE pTail = pHead;
pTail->pNext = NULL;
printf("請輸入鏈表結點個數:len = ");
scanf("%d", &len);
for (i = 0; i < len; i++) {
printf("請輸入第 %d 個結點的值:", i+1);
scanf("%d", &val);
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (!pNew) { printf("分配失敗!\n"); exit(-1); }
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}
int main(void) {
PNODE pHead = create_list();
// 此處可添加遍歷、釋放等操作
return 0;
}
關鍵點總結
- 帶頭結點:統一空表與非空表操作,插入刪除無需特判首元
- 尾指針:實現 O(1) 尾部插入,避免每次遍歷到表尾
- 錯誤處理:
malloc 失敗需檢查並退出
- 內存釋放:使用後必須遍歷釋放所有結點(含頭結點),防止洩漏
擴展練習
- 實現
void traverse(PNODE head) 遍歷輸出
- 實現
void free_list(PNODE head) 完整釋放
- 改為頭插法,觀察數據順序逆轉
- 實現指定位置插入/刪除