C语言邻接表形式储存图,图的广度优先遍历
时间: 2023-12-21 21:55:02 浏览: 83
邻接表是一种常见的图的表示方法,它将每个顶点和与之相连的边都储存在一个链表中。下面是用邻接表表示图的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义图的最大顶点数
#define MAXV 100
// 定义邻接表中的边结构体
typedef struct EdgeNode {
int adjvex; // 相邻顶点编号
struct EdgeNode *next; // 指向下一条边的指针
} EdgeNode;
// 定义邻接表中的顶点结构体
typedef struct VertexNode {
int data; // 顶点的数据域
EdgeNode *firstedge; // 指向第一条边的指针
} VertexNode;
// 定义邻接表结构体
typedef struct {
VertexNode adjlist[MAXV]; // 邻接表
int n, e; // 顶点数和边数
} Graph;
// 创建邻接表
void createGraph(Graph *G) {
int i, j, k;
EdgeNode *e;
printf("请输入图的顶点数和边数:");
scanf("%d %d", &G->n, &G->e);
// 初始化邻接表
for (i = 0; i < G->n; i++) {
printf("请输入第%d个顶点的数据域:", i + 1);
scanf("%d", &G->adjlist[i].data);
G->adjlist[i].firstedge = NULL;
}
// 建立边表
for (k = 0; k < G->e; k++) {
printf("请输入第%d条边的两个顶点编号:", k + 1);
scanf("%d %d", &i, &j);
// 新建一条边
e = (EdgeNode *) malloc(sizeof(EdgeNode));
e->adjvex = j;
e->next = G->adjlist[i].firstedge;
G->adjlist[i].firstedge = e;
// 若为无向图,需建立反向边
e = (EdgeNode *) malloc(sizeof(EdgeNode));
e->adjvex = i;
e->next = G->adjlist[j].firstedge;
G->adjlist[j].firstedge = e;
}
}
// 广度优先遍历
void BFS(Graph G, int v, int visited[]) {
int queue[MAXV];
int front = 0, rear = 0;
int w;
EdgeNode *e;
printf("%d ", G.adjlist[v].data);
visited[v] = 1;
queue[rear++] = v;
while (front < rear) {
v = queue[front++];
e = G.adjlist[v].firstedge;
while (e) {
w = e->adjvex;
if (!visited[w]) {
printf("%d ", G.adjlist[w].data);
visited[w] = 1;
queue[rear++] = w;
}
e = e->next;
}
}
}
int main() {
Graph G;
int visited[MAXV] = {0};
int v;
createGraph(&G);
printf("请输入起始遍历的顶点编号:");
scanf("%d", &v);
printf("广度优先遍历结果为:");
BFS(G, v, visited);
return 0;
}
```
以上代码实现了邻接表的创建和广度优先遍历。其中,`createGraph()`函数用于创建邻接表,`BFS()`函数用于进行广度优先遍历。具体实现过程可参考代码注释。
阅读全文