用C语言在建立的有向图的邻接表存储结构基础上对图进行广度优先搜索遍历并输出顶点序列并举例
时间: 2024-02-13 20:01:19 浏览: 121
好的,我知道了。对于您的问题,我会尽力回答。
首先,我们需要了解有向图的邻接表存储结构。在邻接表中,每个顶点都对应一个链表,链表中存储了该顶点所指向的所有顶点。具体实现可以使用数组来存储顶点,并使用链表来存储每个顶点所指向的顶点。
接下来,我们需要了解广度优先搜索遍历的过程。广度优先搜索遍历是从图中某一顶点开始遍历,先访问该顶点,然后访问该顶点的所有邻接点,再依次访问邻接点的邻接点,直到遍历完整个图。
下面是使用C语言实现广度优先搜索遍历的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXV 100 //最大顶点数
typedef struct node{ //边表结点
int adjvex; //邻接点域,存储该顶点所指向的顶点编号
struct node *next; //链域,指向下一个邻接点
}EdgeNode;
typedef struct vnode{ //顶点表结点
int vertex; //顶点编号
EdgeNode *firstedge; //边表头指针,指向第一个邻接点
}VertexNode;
typedef struct{ //邻接表
VertexNode adjlist[MAXV]; //存储顶点表的数组
int n, e; //图的顶点数和边数
}AdjList;
int visited[MAXV]; //访问标记数组
//创建邻接表
void createAdjList(AdjList *adj){
int i, j, k, w;
EdgeNode *s;
printf("请输入图的顶点数和边数:");
scanf("%d%d", &(adj->n), &(adj->e));
printf("请输入%d个顶点的编号:", adj->n);
for(i = 0; i < adj->n; i++){
scanf("%d", &(adj->adjlist[i].vertex));
adj->adjlist[i].firstedge = NULL; //将边表头指针初始化为空
}
printf("请输入%d条边的起点和终点编号:", adj->e);
for(k = 0; k < adj->e; k++){
scanf("%d%d", &i, &j);
s = (EdgeNode *)malloc(sizeof(EdgeNode));
s->adjvex = j;
s->next = adj->adjlist[i].firstedge; //将新结点插入到边表头
adj->adjlist[i].firstedge = s;
}
}
//广度优先搜索遍历
void BFS(AdjList adj, int v){
int q[MAXV], front = 0, rear = 0; //定义队列
int i, w;
EdgeNode *p;
visited[v] = 1; //标记顶点v已访问
printf("%d ", adj.adjlist[v].vertex); //输出顶点v
q[rear++] = v; //将顶点v入队
while(front != rear){ //队列非空
w = q[front++]; //队头元素出队
p = adj.adjlist[w].firstedge;
while(p != NULL){ //遍历所有邻接点
i = p->adjvex;
if(!visited[i]){ //如果邻接点未被访问
visited[i] = 1; //标记邻接点已访问
printf("%d ", adj.adjlist[i].vertex); //输出邻接点
q[rear++] = i; //将邻接点入队
}
p = p->next;
}
}
}
int main(){
AdjList adj;
int i;
createAdjList(&adj);
printf("请输入起始顶点编号:");
scanf("%d", &i);
printf("广度优先搜索遍历结果为:");
BFS(adj, i);
printf("\n");
return 0;
}
```
以上代码实现了有向图的邻接表存储结构的创建和广度优先搜索遍历,并输出了顶点序列。您可以根据需要修改顶点编号和边的起点和终点,然后编译运行该程序,即可得到广度优先搜索遍历的结果。
例如,我们输入如下数据:
```
请输入图的顶点数和边数:5 7
请输入5个顶点的编号:0 1 2 3 4
请输入7条边的起点和终点编号:0 1 0 2 1 2 1 3 2 3 3 4 4 0
请输入起始顶点编号:0
```
则程序输出如下结果:
```
广度优先搜索遍历结果为:0 1 2 3 4
```
希望我的回答能够解决您的问题。如果您还有其他问题,可以随时问我。
阅读全文