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

C 語言無向圖深度優先遍歷(DFS)常見錯誤與修正

     編輯:程式設計綜合問答

原始程式碼主要問題

  1. 鄰接矩陣初始化邏輯錯誤:雙重迴圈中 `j` 變數超出範圍,導致未正確初始化。
  2. 頂點索引與資料混淆:`vexs[]` 存放頂點資料(如 1,2,3),但演算法直接用資料值當索引訪問 `arcs[][]`,應建立「資料值→索引」映射。
  3. GetFirstVex / GetNextVex 邊界判斷錯誤:條件 `v > G.vexnum` 應為 `v >= G.vexnum`;迴圈上限 `<=` 應為 `<`。
  4. 遞迴 DFS 參數傳值:結構體 `MGraph G` 以值傳遞導致 `visited` 陣列無法共享,必須傳指標 `MGraph* G`。
  5. 頂點輸出格式:`printf("%4c", G.vexs[v])` 若頂點為整數應用 `%d`。

修正關鍵點

// 1. 建立索引映射
int LocateVex(MGraph* G, int v) {
    for (int i = 0; i < G->vexnum; i++)
        if (G->vexs[i] == v) return i;
    return -1;
}

// 2. DFS 傳指標,使用索引
void DFS(MGraph* G, int vIdx) {
    printf("%d ", G->vexs[vIdx]);
    visited[vIdx] = 1;
    int wIdx = GetFirstVex(G, vIdx);
    while (wIdx != -1) {
        if (!visited[wIdx]) DFS(G, wIdx);
        wIdx = GetNextVex(G, vIdx, wIdx);
    }
}

// 3. GetFirstVex / GetNextVex 使用索引遍歷 arcs[][]
int GetFirstVex(MGraph* G, int vIdx) {
    for (int col = 0; col < G->vexnum; col++)
        if (G->arcs[vIdx][col] > 0) return col;
    return -1;
}

參考完整實現

建議參考經典教材或博客範例:C語言圖的深度優先遍歷完整代碼,對照修正上述邏輯錯誤。

核心原則:統一使用 0~n-1 索引操作鄰接矩陣,結構體傳指標,嚴格檢查邊界。

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