首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言鏈式隊列實現錯誤分析:局部變量指針導致數據覆蓋

     編輯:程式設計疑難解答

初學者編寫鏈式隊列時,常犯一個經典錯誤:在入隊函數中使用局部結構體變量 `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;
}

關鍵點總結

  • 隊列節點生命週期必須超出函數作用域 → 必須用堆內存
  • 入隊時正確維護 `front`、`rear` 及 `next` 指針
  • 出隊時釋放內存 `free()` 避免洩漏
  • 參考經典教程:數據結構——鏈隊列詳細實現
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved