定义与概念
链接矩阵(Link Matrix)也称为邻接矩阵(Adjacency Matrix),是表示图(graph)中顶点之间连接关系的矩阵。在一个图中,顶点代表各种实体,比如网页、社交网络中的用户、电路中的节点等,而边代表这些实体之间的关系,比如网页之间的超链接、用户之间的好友关系、电路中节点之间的电气连接等。链接矩阵就是用矩阵的形式来直观地描述这些顶点之间是否存在边的连接关系。
表示方法
设图\(G=(V,E)\),其中\(V=\{v_1,v_2,\cdots,v_n\}\)是顶点集合,\(E\)是边的集合。链接矩阵\(A=(a_{ij})\)是一个\(n\times n\)的矩阵,其元素\(a_{ij}\)定义如下:
- 如果顶点\(v_i\)和\(v_j\)之间有边相连(对于无向图,\(v_i\)与\(v_j\)之间的边等同于\(v_j\)与\(v_i\)之间的边;对于有向图,\(a_{ij}\)表示从\(v_i\)指向\(v_j\)的边),则\(a_{ij}=1\)。
- 如果顶点\(v_i\)和\(v_j\)之间没有边相连,则\(a_{ij}=0\)。
对于带权图,\(a_{ij}\)的值可以是边\((v_i,v_j)\)的权值(如距离、成本等),若\(v_i\)和\(v_j\)之间没有边,则\(a_{ij}\)通常取\(0\)或者\(\infty\)。
c
#include <stdio.h>
#include <stdlib.h>
// 定义图的最大顶点数
#define MAX_VERTICES 100
// 图的结构体
typedef struct Graph {
int vertices; // 顶点数
int **adjMatrix; // 邻接矩阵
} Graph;
// 创建图
Graph* createGraph(int vertices) {
Graph *graph = (Graph*)malloc(sizeof(Graph));
if (graph == NULL) {
printf("内存分配失败\n");
return NULL;
}
graph->vertices = vertices;
// 为邻接矩阵分配内存
graph->adjMatrix = (int**)malloc(vertices * sizeof(int*));
if (graph->adjMatrix == NULL) {
printf("内存分配失败\n");
free(graph);
return NULL;
}
for (int i = 0; i < vertices; i++) {
graph->adjMatrix[i] = (int*)malloc(vertices * sizeof(int));
if (graph->adjMatrix[i] == NULL) {
printf("内存分配失败\n");
// 释放之前分配的内存
for (int j = 0; j < i; j++) {
free(graph->adjMatrix[j]);
}
free(graph->adjMatrix);
free(graph);
return NULL;
}
}
// 初始化邻接矩阵,所有元素置为 0
for (int i = 0; i < vertices; i++) {
for (int j = 0; j < vertices; j++) {
graph->adjMatrix[i][j] = 0;
}
}
return graph;
}
// 添加边
void addEdge(Graph *graph, int src, int dest) {
if (graph == NULL || src < 0 || src >= graph->vertices || dest < 0 || dest >= graph->vertices) {
return;
}
// 无向图,对称设置
graph->adjMatrix[src][dest] = 1;
graph->adjMatrix[dest][src] = 1;
}
// 打印邻接矩阵
void printAdjMatrix(Graph *graph) {
if (graph == NULL) {
return;
}
for (int i = 0; i < graph->vertices; i++) {
for (int j = 0; j < graph->vertices; j++) {
printf("%d ", graph->adjMatrix[i][j]);
}
printf("\n");
}
}
// 释放图的内存
void freeGraph(Graph *graph) {
if (graph == NULL) {
return;
}
for (int i = 0; i < graph->vertices; i++) {
free(graph->adjMatrix[i]);
}
free(graph->adjMatrix);
free(graph);
}
int main() {
int vertices = 5;
Graph *graph = createGraph(vertices);
// 添加边
addEdge(graph, 0, 1);
addEdge(graph, 0, 4);
addEdge(graph, 1, 2);
addEdge(graph, 1, 3);
addEdge(graph, 1, 4);
addEdge(graph, 2, 3);
addEdge(graph, 3, 4);
// 打印邻接矩阵
printf("邻接矩阵如下:\n");
printAdjMatrix(graph);
// 释放图的内存
freeGraph(graph);
return 0;
}
代码解释:
- 结构体定义:定义了一个
Graph
结构体,包含顶点数vertices
和指向邻接矩阵的指针adjMatrix
。 createGraph
函数:用于创建一个图,首先为Graph
结构体分配内存,然后为邻接矩阵分配内存,并将矩阵元素初始化为 0。addEdge
函数:用于在图中添加边,对于无向图,需要对称地设置邻接矩阵的元素。printAdjMatrix
函数:用于打印邻接矩阵,遍历矩阵并输出每个元素。freeGraph
函数:用于释放图占用的内存,避免内存泄漏。main
函数:创建一个包含 5 个顶点的图,添加一些边,打印邻接矩阵,最后释放图的内存。
通过这个示例,你可以了解如何使用 C 语言实现图的邻接矩阵表示,并进行基本的操作。如果要处理有向图或带权图,只需对 addEdge
函数进行相应的修改。