初學者編寫鏈式隊列時,常犯一個經典錯誤:在入隊函數中使用局部結構體變量 `Qnode p`,然後將其地址賦給隊列指針。這會導致所有節點指向同一個棧內存地址,數據全被最後一次輸入覆蓋。
void Enqueue(LinkQueue *q) {
int n;
scanf_s("%d", &n);
for (int i = 1; i <= n; i++) {
Qnode p; // ❌ 錯誤:局部變量,棧上分配,循環結束即銷毀
scanf_s("%d %s", &p.number, p.name, 20);
if (q->front == q->rear) {
q->front = &p; // 所有節點指向同一地址
q->rear = q->front->next = NULL;
} else {
q->rear = &p;
q->rear = q->rear->next = NULL;
}
}
}
必須使用 `malloc` 在堆上為每個節點分配獨立內存:
Qnode *p = (Qnode*)malloc(sizeof(Qnode));
if (!p) exit(EXIT_FAILURE); // 檢查分配是否成功
scanf_s("%d %s", &p->number, p->name, 20);
p->next = NULL; // 初始化 next 指針
if (q->front == NULL) { // 隊列為空
q->front = q->rear = p;
} else {
q->rear->next = p;
q->rear = p;
}