基于图的邻接表存储结构,帮我用C语言实现图的宽度优先遍历
时间: 2023-06-20 12:04:13 浏览: 55
以下是基于图的邻接表存储结构的C语言实现,使用了队列来实现宽度优先遍历:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXV 1000 /* 最大顶点数 */
#define INF 0x3f3f3f3f /* 表示无穷大 */
/* 邻接表存储结构 */
typedef struct AdjNode {
int v; /* 该边所连接的顶点编号 */
int weight; /* 该边的权重 */
struct AdjNode *next; /* 指向下一个邻接点的指针 */
} AdjNode;
typedef struct Graph {
AdjNode *adjList[MAXV]; /* 邻接表 */
int n; /* 顶点数 */
int e; /* 边数 */
} Graph;
/* 图的初始化 */
void initGraph(Graph *g, int n) {
g->n = n;
g->e = 0;
for (int i = 0; i < n; i++) {
g->adjList[i] = NULL;
}
}
/* 添加边 */
void addEdge(Graph *g, int u, int v, int weight) {
/* 添加一条从u到v的边 */
AdjNode *node = (AdjNode *)malloc(sizeof(AdjNode));
node->v = v;
node->weight = weight;
node->next = g->adjList[u];
g->adjList[u] = node;
g->e++;
}
/* 宽度优先遍历 */
void bfs(Graph *g, int s) {
int visited[MAXV] = {0}; /* 标记数组,记录每个顶点是否被访问过 */
int queue[MAXV], front = 0, rear = 0; /* 队列 */
AdjNode *node;
/* 将起点s加入队列 */
queue[rear++] = s;
visited[s] = 1;
/* 遍历整个图 */
while (front < rear) {
int u = queue[front++]; /* 取出队首元素 */
printf("%d ", u);
for (node = g->adjList[u]; node != NULL; node = node->next) {
int v = node->v;
if (!visited[v]) {
queue[rear++] = v; /* 将v加入队列 */
visited[v] = 1; /* 标记v为已访问 */
}
}
}
printf("\n");
}
int main() {
Graph g;
int n, m, u, v, weight;
printf("请输入图的顶点数和边数:");
scanf("%d%d", &n, &m);
initGraph(&g, n);
printf("请输入每条边的起点、终点和权重:\n");
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &u, &v, &weight);
addEdge(&g, u, v, weight);
}
printf("宽度优先遍历的结果为:");
bfs(&g, 0);
return 0;
}
```
这个程序中,我们首先定义了一个邻接表的数据结构,然后定义了图的初始化、添加边和宽度优先遍历等函数。在宽度优先遍历函数中,我们使用了队列来实现广度优先搜索的过程。程序的输入格式为:
```
请输入图的顶点数和边数:
6 7
请输入每条边的起点、终点和权重:
0 1 1
0 2 1
1 3 1
1 4 1
2 4 1
3 5 1
4 5 1
```
其中第一行输入了图的顶点数n和边数m,接下来m行输入每条边的起点、终点和权重。程序的输出格式为:
```
宽度优先遍历的结果为:0 1 2 3 4 5
```
这个结果表示从顶点0开始,按照宽度优先的顺序遍历图时,各顶点的访问顺序。