C语言建立邻接矩阵的方法:使用二维数组存储、初始化矩阵、添加边、显示矩阵。在C语言中,使用二维数组存储图的邻接关系是一种有效且直观的方法。接下来,我们详细探讨如何在C语言中实现邻接矩阵。
一、什么是邻接矩阵
邻接矩阵是一种图的表示方法,用于表示图中顶点之间的连接关系。在邻接矩阵中,使用一个二维数组来存储图的顶点之间的边。若顶点i和顶点j之间有边存在,则矩阵的第i行第j列的值为1(或边的权重值);若没有边存在,则该值为0。
二、初始化邻接矩阵
初始化邻接矩阵是创建图的第一步,通常我们需要根据图的顶点数量来创建一个合适大小的二维数组。
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100
void initializeMatrix(int matrix[MAX_VERTICES][MAX_VERTICES], int vertices) {
for (int i = 0; i < vertices; i++) {
for (int j = 0; j < vertices; j++) {
matrix[i][j] = 0;
}
}
}
int main() {
int vertices = 5;
int adjacencyMatrix[MAX_VERTICES][MAX_VERTICES];
initializeMatrix(adjacencyMatrix, vertices);
// display initialized matrix
for (int i = 0; i < vertices; i++) {
for (int j = 0; j < vertices; j++) {
printf("%d ", adjacencyMatrix[i][j]);
}
printf("n");
}
return 0;
}
在上面的代码中,我们定义了一个 MAX_VERTICES
常量来限制顶点数量,并使用一个二维数组 adjacencyMatrix
来存储邻接关系。initializeMatrix
函数用于将该矩阵初始化为0。
三、添加边
为了在图中添加边,需要修改邻接矩阵中相应位置的值。对于无向图,矩阵是对称的,即 matrix[i][j] = matrix[j][i]
;对于有向图,只需设置 matrix[i][j]
。
void addEdge(int matrix[MAX_VERTICES][MAX_VERTICES], int startVertex, int endVertex) {
matrix[startVertex][endVertex] = 1;
matrix[endVertex][startVertex] = 1; // 如果是无向图
}
int main() {
int vertices = 5;
int adjacencyMatrix[MAX_VERTICES][MAX_VERTICES];
initializeMatrix(adjacencyMatrix, vertices);
addEdge(adjacencyMatrix, 0, 1);
addEdge(adjacencyMatrix, 0, 4);
addEdge(adjacencyMatrix, 1, 2);
addEdge(adjacencyMatrix, 1, 3);
addEdge(adjacencyMatrix, 1, 4);
addEdge(adjacencyMatrix, 2, 3);
addEdge(adjacencyMatrix, 3, 4);
// display matrix with edges
for (int i = 0; i < vertices; i++) {
for (int j = 0; j < vertices; j++) {
printf("%d ", adjacencyMatrix[i][j]);
}
printf("n");
}
return 0;
}
在这个代码段中,我们使用 addEdge
函数来添加顶点之间的边。对于每个调用 addEdge
,我们更新相应的矩阵值。
四、显示邻接矩阵
为了更好地理解和调试图的结构,我们需要一个函数来显示邻接矩阵。
void displayMatrix(int matrix[MAX_VERTICES][MAX_VERTICES], int vertices) {
for (int i = 0; i < vertices; i++) {
for (int j = 0; j < vertices; j++) {
printf("%d ", matrix[i][j]);
}
printf("n");
}
}
int main() {
int vertices = 5;
int adjacencyMatrix[MAX_VERTICES][MAX_VERTICES];
initializeMatrix(adjacencyMatrix, vertices);
addEdge(adjacencyMatrix, 0, 1);
addEdge(adjacencyMatrix, 0, 4);
addEdge(adjacencyMatrix, 1, 2);
addEdge(adjacencyMatrix, 1, 3);
addEdge(adjacencyMatrix, 1, 4);
addEdge(adjacencyMatrix, 2, 3);
addEdge(adjacencyMatrix, 3, 4);
displayMatrix(adjacencyMatrix, vertices);
return 0;
}
在这个代码段中,我们定义了一个 displayMatrix
函数,用于打印邻接矩阵。这样可以更方便地查看图的结构。
五、处理带权重的图
对于带权重的图,我们只需将矩阵中存储的值从1改为边的权重即可。
void addWeightedEdge(int matrix[MAX_VERTICES][MAX_VERTICES], int startVertex, int endVertex, int weight) {
matrix[startVertex][endVertex] = weight;
matrix[endVertex][startVertex] = weight; // 如果是无向图
}
int main() {
int vertices = 5;
int adjacencyMatrix[MAX_VERTICES][MAX_VERTICES];
initializeMatrix(adjacencyMatrix, vertices);
addWeightedEdge(adjacencyMatrix, 0, 1, 2);
addWeightedEdge(adjacencyMatrix, 0, 4, 3);
addWeightedEdge(adjacencyMatrix, 1, 2, 4);
addWeightedEdge(adjacencyMatrix, 1, 3, 5);
addWeightedEdge(adjacencyMatrix, 1, 4, 6);
addWeightedEdge(adjacencyMatrix, 2, 3, 7);
addWeightedEdge(adjacencyMatrix, 3, 4, 8);
displayMatrix(adjacencyMatrix, vertices);
return 0;
}
在这个代码段中,我们定义了一个 addWeightedEdge
函数,用于在矩阵中添加带权重的边。这样,我们可以表示更复杂的图结构。
六、删除边
有时我们需要从图中删除某条边,这可以通过将矩阵中相应位置的值重置为0来实现。
void removeEdge(int matrix[MAX_VERTICES][MAX_VERTICES], int startVertex, int endVertex) {
matrix[startVertex][endVertex] = 0;
matrix[endVertex][startVertex] = 0; // 如果是无向图
}
int main() {
int vertices = 5;
int adjacencyMatrix[MAX_VERTICES][MAX_VERTICES];
initializeMatrix(adjacencyMatrix, vertices);
addEdge(adjacencyMatrix, 0, 1);
addEdge(adjacencyMatrix, 0, 4);
addEdge(adjacencyMatrix, 1, 2);
addEdge(adjacencyMatrix, 1, 3);
addEdge(adjacencyMatrix, 1, 4);
addEdge(adjacencyMatrix, 2, 3);
addEdge(adjacencyMatrix, 3, 4);
removeEdge(adjacencyMatrix, 1, 4);
displayMatrix(adjacencyMatrix, vertices);
return 0;
}
在这个代码段中,我们定义了一个 removeEdge
函数,用于在矩阵中删除指定的边。通过调用这个函数,我们可以动态地修改图的结构。
七、图的遍历
邻接矩阵不仅可以用于存储图的结构,还可以用于实现图的遍历,如深度优先搜索(DFS)和广度优先搜索(BFS)。
深度优先搜索(DFS)
void DFS(int matrix[MAX_VERTICES][MAX_VERTICES], int startVertex, int vertices, int visited[]) {
printf("%d ", startVertex);
visited[startVertex] = 1;
for (int i = 0; i < vertices; i++) {
if (matrix[startVertex][i] == 1 && !visited[i]) {
DFS(matrix, i, vertices, visited);
}
}
}
int main() {
int vertices = 5;
int adjacencyMatrix[MAX_VERTICES][MAX_VERTICES];
int visited[MAX_VERTICES] = {0};
initializeMatrix(adjacencyMatrix, vertices);
addEdge(adjacencyMatrix, 0, 1);
addEdge(adjacencyMatrix, 0, 4);
addEdge(adjacencyMatrix, 1, 2);
addEdge(adjacencyMatrix, 1, 3);
addEdge(adjacencyMatrix, 1, 4);
addEdge(adjacencyMatrix, 2, 3);
addEdge(adjacencyMatrix, 3, 4);
printf("Depth First Search starting from vertex 0:n");
DFS(adjacencyMatrix, 0, vertices, visited);
return 0;
}
在这个代码段中,我们定义了一个 DFS
函数,用于进行深度优先搜索。通过递归地访问相邻顶点,我们可以遍历整个图。
广度优先搜索(BFS)
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100
#define QUEUE_SIZE 100
typedef struct {
int items[QUEUE_SIZE];
int front;
int rear;
} Queue;
void initializeQueue(Queue *q) {
q->front = -1;
q->rear = -1;
}
int isEmpty(Queue *q) {
return q->front == -1;
}
void enqueue(Queue *q, int value) {
if (q->rear == QUEUE_SIZE - 1) {
printf("Queue is fulln");
return;
}
if (q->front == -1) {
q->front = 0;
}
q->rear++;
q->items[q->rear] = value;
}
int dequeue(Queue *q) {
int item;
if (isEmpty(q)) {
printf("Queue is emptyn");
return -1;
}
item = q->items[q->front];
q->front++;
if (q->front > q->rear) {
q->front = q->rear = -1;
}
return item;
}
void BFS(int matrix[MAX_VERTICES][MAX_VERTICES], int startVertex, int vertices) {
Queue q;
int visited[MAX_VERTICES] = {0};
initializeQueue(&q);
visited[startVertex] = 1;
enqueue(&q, startVertex);
while (!isEmpty(&q)) {
int currentVertex = dequeue(&q);
printf("%d ", currentVertex);
for (int i = 0; i < vertices; i++) {
if (matrix[currentVertex][i] == 1 && !visited[i]) {
visited[i] = 1;
enqueue(&q, i);
}
}
}
}
int main() {
int vertices = 5;
int adjacencyMatrix[MAX_VERTICES][MAX_VERTICES];
initializeMatrix(adjacencyMatrix, vertices);
addEdge(adjacencyMatrix, 0, 1);
addEdge(adjacencyMatrix, 0, 4);
addEdge(adjacencyMatrix, 1, 2);
addEdge(adjacencyMatrix, 1, 3);
addEdge(adjacencyMatrix, 1, 4);
addEdge(adjacencyMatrix, 2, 3);
addEdge(adjacencyMatrix, 3, 4);
printf("Breadth First Search starting from vertex 0:n");
BFS(adjacencyMatrix, 0, vertices);
return 0;
}
在这个代码段中,我们定义了一个 BFS
函数,用于进行广度优先搜索。通过使用队列,我们可以逐层访问图的各个顶点。
八、总结
通过上述步骤,我们已经了解了如何在C语言中建立邻接矩阵,并进行了图的初始化、添加边、删除边以及图的遍历。邻接矩阵是一种直观且易于实现的图表示方法,但在处理稀疏图时可能会消耗较多的存储空间。因此,在实际应用中,选择合适的数据结构来表示图是非常重要的。对于需要进行复杂项目管理和协作的团队,可以考虑使用研发项目管理系统PingCode和通用项目管理软件Worktile来提升效率和协作效果。
相关问答FAQs:
1. C语言中如何表示邻接矩阵?
在C语言中,邻接矩阵通常使用二维数组来表示。数组的行和列分别代表图中的顶点,而数组中的元素则表示顶点之间的连接关系。
2. 如何在C语言中建立邻接矩阵?
要建立邻接矩阵,首先需要确定图的顶点数量和边的数量。然后,创建一个二维数组,并将所有元素初始化为0。接下来,根据图的边的信息,将邻接矩阵中对应的位置设置为1或其他代表边的权重的值。
3. 如何在C语言中访问邻接矩阵中的元素?
要访问邻接矩阵中的元素,只需使用数组的行和列索引即可。例如,要访问第i行第j列的元素,可以使用matrix[i][j]来获取该元素的值。可以使用循环来遍历整个邻接矩阵,访问所有的元素。
原创文章,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/1012541