图(邻接矩阵)

2018-08-15  本文已影响191人  lkmc2

图的邻接矩阵:该存储方式使用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边的信息。

无向图 邻接矩阵结构图

实现代码如下:

// 图(邻接矩阵)
#include <stdio.h>

#define MAXVEX 100 // 最大顶点数
#define INFINITY 65535 // 无穷

typedef char VertexType; // 顶点元素类型
typedef int EdgeType; // 边上权值的类型

// 邻接矩阵结构(无向图)
typedef struct {
    VertexType vexs[MAXVEX]; // 顶点表
    EdgeType arc[MAXVEX][MAXVEX]; // 边表
    int numNodes, numEdges; // 图的顶点数、边数
} MGraph;

/**
 * 创建无向图的临接矩阵表示
 * @param G 邻接矩阵(无向图)
 */
void CreateMGraph(MGraph *G) {
    int i, j, k, w;

    printf("请输入顶点数和边数:\n");
    scanf("%d,%d", &G->numNodes, &G->numEdges); // 读取顶点数和边数
    getchar(); // 用于抵消回车键

    printf("请输入%d个顶点的值:\n", G->numNodes);
    // 依次输入顶点表信息
    for (i = 0; i < G->numNodes; i++) {
        scanf("%c", &G->vexs[i]); // 读取用户输入的值到顶点表中
        getchar();  // 用于抵消回车键
    }

    printf("请输入%d条边的值:\n", G->numEdges);
    // 初始化边表
    for (i = 0; i < G->numNodes; i++) {
        for (j = 0; j < G->numNodes; j++) {
            G->arc[i][j] = INFINITY; // 设置边表中所有的值为无穷
        }
    }

    // 依次输入边表信息
    for (k = 0; k < G->numEdges; k++) {
        printf("输入边(vi,vj)的下标i,下标j和权值w:\n");
        scanf("%d,%d,%d", &i, &j, &w); // 输入边(vi,vj)上的权
        getchar(); // 用于抵消回车键

        G->arc[i][j] = w; // 设置边(vi,vj)上的权值
        G->arc[j][i] = G->arc[i][j]; // 因为是无向图,矩阵对称,边(vj,vi)等于边(vi,vj)
    }
}

/**
 * 打印无向图
 * @param G 邻接矩阵(无向图)
 */
void Print(MGraph *G) {
    int i, j; // 用来遍历元素

    printf("顶点表的值为:\n");
    // 打印顶点表
    for (i = 0; i < G->numNodes; i++) {
        printf("v%d: %c\n", i, G->vexs[i]);
    }
    printf("\n");

    printf("边表的值为:\n");
    // 打印边表
    for (i = 0; i < G->numNodes; i++) {
        for (j = 0; j < G->numNodes; j++) {
            if (G->arc[i][j] != INFINITY) { // 元素不为无穷,表示该边有值
                printf("<v%d, v%d>: %d\n", i, j, G->arc[i][j]);
            }
        }
    }
}

int main() {
    MGraph G; // 邻接矩阵
    CreateMGraph(&G); // 创建邻接矩阵(无向图)
    Print(&G); // 打印邻接矩阵(无向图)

    return 0;
}
运行结果
上一篇 下一篇

猜你喜欢

热点阅读