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

C 語言鏈式隊列空判斷邏輯錯誤:缺少結構體定義與頭節點設計缺陷

     編輯:程式設計綜合問答

問題代碼特徵

開發者實現鏈隊列 5 大操作(初始化、判空、入隊、出隊、取頭),編譯報錯集中在第 42 行 `Empty_Queue` 判斷邏輯,且最佳回答直接指出:代碼不全,沒有結構體 `LinkQueue` 定義。

典型鏈隊列結構設計

typedef struct QNode {
    int data;
    struct QNode *next;
} QNode, *QueuePtr;

typedef struct {
    QueuePtr front; // 隊頭指針
    QueuePtr rear;  // 隊尾指針
} LinkQueue;

帶頭節點的初始化與判空

  • 初始化:分配頭節點,`front = rear = head`,`head->next = NULL`。
  • 判空:`return Q.front == Q.rear;`(或 `Q.front->next == NULL`)。
  • 入隊:新節點掛在 `rear->next`,移動 `rear`。
  • 出隊:刪除 `front->next`,若刪除後 `front->next == NULL` 則 `rear = front`。

原代碼邏輯漏洞

  1. 結構體未定義,編譯器無法識別 `LinkQueue` 成員,導致所有成員訪問報錯。
  2. 初始化函數中 `Q->front->next = head;` 但 `head` 未聲明,且 `Q` 為傳值指針,修改不會反映到調用者(需傳 `LinkQueue **` 或返回結構體)。
  3. 判空條件 `(Q->front->next==NULL)&&(Q->rear->next==NULL)&&(k=1)` 中 `k` 未聲明,且 `k=1` 是賦值非比較。
  4. 入隊邏輯 `head=q; head->next=Q->rear->next;` 破壞鏈表結構。

標準實現參考

int InitQueue(LinkQueue *Q) {
    Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
    if (!Q->front) return 0;
    Q->front->next = NULL;
    return 1;
}
int EmptyQueue(LinkQueue Q) { return Q.front == Q.rear; }
int EnQueue(LinkQueue *Q, int e) {
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if (!p) return 0;
    p->data = e; p->next = NULL;
    Q->rear->next = p; Q->rear = p;
    return 1;
}
int DeQueue(LinkQueue *Q, int *e) {
    if (EmptyQueue(*Q)) return 0;
    QueuePtr p = Q->front->next;
    *e = p->data;
    Q->front->next = p->next;
    if (Q->rear == p) Q->rear = Q->front;
    free(p);
    return 1;
}

學習建議

數據結構代碼必須先寫全結構體定義,再實現操作函數。畫圖推演指針變化(頭節點、front/rear 移動)是避免邏輯錯誤的關鍵。調試時打印節點地址與 `next` 指向,驗證鏈表完整性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved