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

C 語言圖的鄰接矩陣創建與輸出代碼修復:指針初始化、循環條件、內存分配全解析

     編輯:程式設計綜合問答

原代碼核心錯誤

  1. 圖指針 `g` 未初始化:`mgraph* g;` 僅聲明指針,未分配內存,調用 `createmgraph(g)` 傳遞野指針,解引用導致崩潰。
  2. 循環條件寫錯:`for(i=0;i
  3. 頂點讀入 `%c` 吃掉換行符:`scanf("%c", ...)` 需處理緩衝區殘留換行。
  4. 輸出循環邏輯錯:用 `numedges` 作為行列上限,應用 `numvertexes`。
  5. 缺少標準庫頭文件:`#include `、``。

修復後完整代碼 (C99 標準)

#include 
#include 

#define MAXVEX 100
#define INFINITY 65535

typedef int EdgeType;
typedef char VertexType;

typedef struct {
    VertexType vexs[MAXVEX];
    EdgeType arc[MAXVEX][MAXVEX];
    int numVertexes, numEdges;
} MGraph;

void CreateMGraph(MGraph *g) {
    int i, j, k, w;
    printf("輸入頂點數和邊數:\\n");
    if (scanf("%d %d", &g->numVertexes, &g->numEdges) != 2) return;
    getchar(); // 吸收換行符

    printf("輸入 %d 個頂點字符:\\n", g->numVertexes);
    for (i = 0; i < g->numVertexes; i++) {
        scanf("%c", &g->vexs[i]);
        getchar(); // 每次吸收換行
    }

    // 初始化鄰接矩陣
    for (i = 0; i < g->numVertexes; i++)
        for (j = 0; j < g->numVertexes; j++)
            g->arc[i][j] = INFINITY;

    printf("輸入邊 (vi, vj) 的下標 i, j 和權 w:\\n");
    for (k = 0; k < g->numEdges; k++) {
        if (scanf("%d %d %d", &i, &j, &w) != 3) break;
        if (i >= 0 && i < g->numVertexes && j >= 0 && j < g->numVertexes) {
            g->arc[i][j] = w;
            g->arc[j][i] = w; // 無向圖
        }
    }
}

void PrintGraphEdges(const MGraph *g) {
    printf("圖的所有邊:\\n");
    for (int i = 0; i < g->numVertexes; i++) {
        for (int j = i + 1; j < g->numVertexes; j++) { // 只輸出上三角,避免重複
            if (g->arc[i][j] != INFINITY && g->arc[i][j] != 0) {
                printf("(%c, %c) 權值: %d\\n", g->vexs[i], g->vexs[j], g->arc[i][j]);
            }
        }
    }
}

int main() {
    MGraph *g = (MGraph*)malloc(sizeof(MGraph));
    if (!g) {
        fprintf(stderr, "內存分配失敗\\n");
        return 1;
    }

    CreateMGraph(g);
    PrintGraphEdges(g);

    free(g);
    return 0;
}

關鍵修復點對照表

原問題修復方案
`mgraph* g;` 未分配`MGraph *g = malloc(sizeof(MGraph));` 並在 `main` 結束前 `free(g);`
循環條件語法錯誤補全分號、正確變量名 (`i < g->numVertexes`)
`scanf("%c")` 讀取換行每次 `scanf("%c")` 後 `getchar()` 吸收換行,或用 `scanf(" %c", ...)` (空格跳過空白)
邊輸出邏輯混亂雙層循環上限用 `numVertexes`,條件判斷 `!= INFINITY`,只輸出上三角避免重複
缺少錯誤處理檢查 `scanf` 返回值、`malloc` 返回值、下標越界

調試建議

  1. 編譯加旗標:`gcc -Wall -Wextra -std=c99 -g graph.c -o graph`,開啟所有警告。
  2. 使用 Valgrind 檢測內存錯誤:`valgrind ./graph`。
  3. 輸入測試數據:
4 4
A
B
C
D
0 1 10
0 2 20
1 2 30
2 3 40

預期輸出:

圖的所有邊:
(A, B) 權值: 10
(A, C) 權值: 20
(B, C) 權值: 30
(C, D) 權值: 40

指針必須指向有效內存、循環邊界嚴謹、輸入緩衝區處理得當,是 C 語言數據結構編程的三大鐵律。

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