使用邻接矩阵的C语言广度优先遍历算法子函数
时间: 2023-06-22 19:31:07 浏览: 82
c++实现邻接矩阵的广度优先遍历
好的,以下是使用邻接矩阵的C语言广度优先遍历算法子函数:
```c
#define MAX_VERTEX_NUM 100
#define MAX_QUEUE_SIZE 100
int visited[MAX_VERTEX_NUM]; // 记录节点是否被访问过的数组
int Queue[MAX_QUEUE_SIZE]; // 队列
int front, rear;
// 邻接矩阵广度优先遍历函数
void BFS(MGraph G, int v) {
int i, j;
front = rear = -1;
printf("%c ", G.vexs[v]); // 访问起点v
visited[v] = 1;
Queue[++rear] = v; // 起点v入队
while (front != rear) { // 队列不为空
i = Queue[++front]; // 队头元素出队并访问
for (j = 0; j < G.vexnum; j++) {
if (G.arcs[i][j] != 0 && !visited[j]) { // 有边且未被访问
printf("%c ", G.vexs[j]); // 访问相邻节点j
visited[j] = 1;
Queue[++rear] = j; // 相邻节点j入队
}
}
}
}
```
其中,`MGraph`结构体是邻接矩阵存储方式的图的存储结构:
```c
typedef struct {
char vexs[MAX_VERTEX_NUM]; // 顶点集合
int vexnum, arcnum; // 顶点数和边数
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
} MGraph;
```
`visited`数组用于记录节点是否被访问过,初始时所有元素都为0,表示所有节点都未被访问过。`Queue`数组用于存放已经访问过但相邻节点还未访问的节点,初始时队列为空。
在广度优先遍历中,首先访问起点`v`,并将其入队。然后从队列头部取出一个元素`i`,访问`i`的所有相邻节点,若相邻节点`j`未被访问,则将其入队。重复以上过程,直到队列为空。
阅读全文