初學 C 語言鏈表時,常遇到「輸出結果最後多出一個莫名其妙的數值」的問題。本文通過具體代碼分析,揭示其根本原因,並給出正確的鏈表構建邏輯。
void append(Node *head) {
int n;
Node *p, *news = NULL;
p = head; // 保存首地址
while (1) {
scanf("%d", &n);
if (n == -1) break;
p->data = n; // 先給當前節點賦值
news = (Node *)malloc(sizeof(Node)); // 再分配新節點
news->next = NULL;
p->next = news; // 當前節點指向新節點
p = news; // 移動到新節點
}
p = NULL;
}
當輸入 1 2 -1 時,實際鏈表結構為:
循環結束前,已為「下一個」節點分配了內存並掛鏈,但該節點的 data 從未被賦值,打印時輸出的是棧上隨機殘留值。
void append(Node *head) {
int n, index = 0;
Node *p = head, *news = NULL;
while (1) {
scanf("%d", &n);
if (n == -1) break;
if (index == 0) { // 首節點直接賦值
p->data = n;
index++;
continue;
}
news = (Node *)malloc(sizeof(Node));
news->data = n; // 先給新節點賦值
news->next = NULL;
p->next = news; // 再掛鏈
p = news;
}
}
malloc,並立即初始化其 data 和 next。#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
void append(Node *head) {
int n;
Node *p = head, *news = NULL;
while (scanf("%d", &n) == 1 && n != -1) {
news = (Node *)malloc(sizeof(Node));
news->data = n;
news->next = NULL;
p->next = news;
p = news;
}
}
void print(Node *head) {
Node *p = head->next; // 跳過頭節點
while (p) {
printf("%d\t", p->data);
p = p->next;
}
putchar('\n');
}
int main() {
Node *head = (Node *)malloc(sizeof(Node));
head->next = NULL;
append(head);
print(head);
return 0;
}
掌握「先構建節點,再接入鏈表」的習慣,即可避免此類越界/臟數據問題。