原代碼核心問題
- 創建邏輯錯誤: 首節點未正確鏈接,
r=0導致空指針解引用
- 輸入處理缺陷:
scanf("%c") 讀取殘留換行符
- 輸出函數假設有頭節點:
p=L->next 跳過首節點
修正版:無頭節點單鏈表完整實現
#include
#include
typedef int ElemType;
typedef struct Node {
ElemType data;
struct Node *next;
} Node;
// 尾插法創建(無頭節點)
Node* CreateList(ElemType a[], int n) {
if (n <= 0) return NULL;
Node *head = (Node*)malloc(sizeof(Node));
head->data = a[0];
head->next = NULL;
Node *tail = head;
for (int i = 1; i < n; i++) {
Node *p = (Node*)malloc(sizeof(Node));
p->data = a[i];
p->next = NULL;
tail->next = p;
tail = p;
}
return head;
}
// 輸出鏈表
void DispList(Node *head) {
Node *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 釋放鏈表
void FreeList(Node *head) {
Node *p = head;
while (p) {
Node *tmp = p;
p = p->next;
free(tmp);
}
}
int main() {
ElemType a[10] = {1,2,3,4,5,6,7,8,9,0};
Node *L = CreateList(a, 10);
DispList(L);
FreeList(L);
return 0;
}
關鍵點對比
| 場景 | 有頭節點 | 無頭節點 |
| 創建返回 | 頭節點指針 | 首數據節點指針 |
| 插入首位 | 統一邏輯 | 需特判修改head指針 |
| 刪除首位 | 統一邏輯 | 需特判修改head指針 |
| 代碼複雜度 | 較低 | 較高 |
進階建議
- 教學/面試常考無頭節點,工程實踐強烈推薦帶頭節點
- 封裝
List結構體包含head, tail, size,操作更安全
- 使用
valgrind --leak-check=full檢測內存洩漏