-
首先,定义了一些基本的数据结构和常量:
VertexType
:顶点的数据类型,这里定义为char
。EdgeType
:边的数据类型,这里定义为int
,用于存储权重。MAXVEX
:定义了图中最大顶点数为100。INFINITY
:定义了一个很大的数65535,用于表示顶点之间没有直接的边。
-
定义了一个结构体
MGraph
,用于表示图:vexs
:一个数组,用于存储图中的顶点。arc
:一个二维数组,用于存储图的邻接矩阵,即图中每一条边的权重。numNodes
:图中顶点的数量。numEdges
:图中边的数量。
-
CreateMGraph
函数用于创建图:- 首先,通过
scanf_s
函数读取用户输入的顶点数和边数,并存储在图的相应字段中。 - 然后,通过循环读取每个顶点的信息,并存储在
vexs
数组中。 - 接下来,初始化邻接矩阵
arc
,将所有值设置为INFINITY
,表示一开始所有顶点之间都没有直接的边。 - 最后,通过循环读取用户输入的每一条边的信息(包括边的两个顶点的下标和权重),并更新邻接矩阵
arc
。
- 首先,通过
-
PrintMGraph
函数用于打印图的邻接矩阵:- 通过嵌套循环遍历邻接矩阵,并打印出每个顶点之间的权重。如果两个顶点之间没有直接的边,则打印
∞
。
- 通过嵌套循环遍历邻接矩阵,并打印出每个顶点之间的权重。如果两个顶点之间没有直接的边,则打印
-
main
函数是程序的入口点:- 首先,声明一个
MGraph
类型的变量G
。 - 然后,调用
CreateMGraph
函数创建图。 - 接着,调用
PrintMGraph
函数打印图的邻接矩阵。 - 最后,程序返回0,表示正常退出。
- 首先,声明一个
#include <stdio.h>
#include <stdlib.h>
//有向图
typedef char VertexType;
typedef int EdgeType;
#define MAXVEX 100
#define INFINITY 65535typedef struct {VertexType vexs[MAXVEX];EdgeType arc[MAXVEX][MAXVEX];int numNodes, numEdges;
} MGraph;void CreateMGraph(MGraph* G) {int i, j, k, w;printf("输入顶点数和边数:\n");scanf_s("%d,%d", &G->numNodes, &G->numEdges);for (i = 0; i < G->numNodes; i++)scanf_s(&G->vexs[i]); // 读取顶点信息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_s("%d,%d,%d", &i, &j, &w);if (i < 0 || i >= G->numNodes || j < 0 || j >= G->numNodes) {printf("顶点下标超出范围。\n");exit(EXIT_FAILURE);}G->arc[i][j] = w; // 有向图,只设置一个方向的权重}
}void PrintMGraph(MGraph G) {int i, j;printf("图的顶点和边如下:\n");for (i = 0; i < G.numNodes; i++) {for (j = 0; j < G.numNodes; j++) {if (G.arc[i][j] == INFINITY)printf("∞\t");elseprintf("%d\t", G.arc[i][j]);}printf("\n");}
}int main() {MGraph G;CreateMGraph(&G);PrintMGraph(G);return 0;
}
结果如下: