c语言如何建立邻接矩阵

c语言如何建立邻接矩阵

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

(0)
Edit1Edit1
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部