-
首先,定义了一些基本的数据结构和常量:
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 65535
typedef 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");
else
printf("%d\t", G.arc[i][j]);
}
printf("\n");
}
}
int main() {
MGraph G;
CreateMGraph(&G);
PrintMGraph(G);
return 0;
}
结果如下: