#include <stdio.h>
#include <stdlib.h>
#define MaxVertex 5 // 最大顶点
typedef char E; // 顶点的数据类型为字符
// 定义图的结构体
typedef struct MatrixGraph {
int vertexCount, edgeCount; // 顶点数和边数
int matrix[MaxVertex][MaxVertex]; // 邻接矩阵
E data[MaxVertex]; // 存储顶点数据的数组
} *Graph;
// 创建图并初始化
Graph create() {
Graph g = malloc(sizeof(struct MatrixGraph)); // 为图分配内存空间
g->vertexCount = g->edgeCount = 0; // 初始时顶点数和边数均为0
// 初始化邻接矩阵为全0
for (int i = 0; i < MaxVertex; i++) {
for (int j = 0; j < MaxVertex; j++) {
g->matrix[i][j] = 0;
}
}
return g; // 返回图的指针
}
// 添加顶点
void addVertex(Graph g, E e) {
if (g->vertexCount >= MaxVertex) return; // 如果顶点数量超过最大值,返回
g->data[g->vertexCount++] = e; // 将新顶点e添加到data数组中,并增加顶点数
}
// 添加边
void addEdge(Graph g, int a, int b) {
if (g->matrix[a][b] == 0) { // 如果a到b没有边
g->matrix[a][b] = 1; // 在邻接矩阵中标记a到b有边
g->edgeCount++; // 边数增加
}
}
// 打印图的邻接矩阵
void printGraph(Graph g) {
// 打印邻接矩阵
for (int i = -1; i < g->vertexCount; i++) {
for (int j = -1; j < g->vertexCount; j++) {
if (j == -1)
printf("%c ", 'A' + i); // 打印第一列,即顶点标签(A, B, C等)
else if (i == -1)
printf("%3c ", 'A' + j); // 打印第一行,即顶点标签(A, B, C等)
else
printf("%3d ", g->matrix[i][j]); // 打印邻接矩阵中的值,0表示没有边,1表示有边
}
putchar('\n');
}
}
// 主函数
int main(void) {
Graph graph = create(); // 创建图并初始化
// 添加顶点A、B、C、D
for (int c = 'A'; c <= 'D'; ++c) {
addVertex(graph, (char)c); // 向图中添加顶点
}
// 添加边
addEdge(graph, 0, 1); // A -> B
addEdge(graph, 1, 2); // B -> C
addEdge(graph, 2, 3); // C -> D
addEdge(graph, 3, 0); // D -> A
addEdge(graph, 2, 0); // C -> A
// 打印图的邻接矩阵
printGraph(graph);
}