用C语言编写代码实现图的深度优先,广度优先遍历。可键盘输入数据
时间: 2024-02-25 19:52:32 浏览: 81
好的,我可以帮你解答这个问题。实现图的深度优先和广度优先遍历,需要用到图的数据结构和相应的算法。这里我以邻接表表示图,分别给出深度优先和广度优先遍历的代码。你可以在代码中输入图的数据,进行遍历。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100
typedef struct ArcNode{
int adjvex; // 邻接点在顶点数组中的位置下标
struct ArcNode *nextarc; // 指向下一个邻接点的指针
}ArcNode;
typedef struct VertexNode{
int data; // 顶点数据
ArcNode *firstarc; // 指向第一个邻接点的指针
}VertexNode, AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices; // 存放邻接表的数组
int vexnum, arcnum; // 图的顶点数和弧数
}ALGraph;
// 初始化邻接表
void InitGraph(ALGraph *G, int n){
int i, j;
G->vexnum = n;
G->arcnum = 0;
for(i = 0; i < n; i++){
G->vertices[i].data = i;
G->vertices[i].firstarc = NULL;
}
}
// 插入一条边
void InsertArc(ALGraph *G, int v, int w){
ArcNode *p;
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = w;
p->nextarc = G->vertices[v].firstarc;
G->vertices[v].firstarc = p;
}
// 深度优先遍历
void DFS(ALGraph G, int i, int *visited){
ArcNode *p;
visited[i] = 1;
printf("%d ", G.vertices[i].data); // 访问顶点i
p = G.vertices[i].firstarc;
while(p != NULL){
if(!visited[p->adjvex]){
DFS(G, p->adjvex, visited);
}
p = p->nextarc;
}
}
// 广度优先遍历
void BFS(ALGraph G, int i, int *visited){
int queue[MAX_VERTEX_NUM];
int front = -1, rear = -1;
ArcNode *p;
visited[i] = 1;
printf("%d ", G.vertices[i].data); // 访问顶点i
queue[++rear] = i;
while(front != rear){
i = queue[++front];
p = G.vertices[i].firstarc;
while(p != NULL){
if(!visited[p->adjvex]){
visited[p->adjvex] = 1;
printf("%d ", G.vertices[p->adjvex].data); // 访问顶点p->adjvex
queue[++rear] = p->adjvex;
}
p = p->nextarc;
}
}
}
int main(){
ALGraph G;
int n, m, i, v, w;
int visited[MAX_VERTEX_NUM] = {0};
printf("请输入图的顶点数和边数:");
scanf("%d%d", &n, &m);
InitGraph(&G, n);
printf("请输入每条边的两个顶点:\n");
for(i = 0; i < m; i++){
scanf("%d%d", &v, &w);
InsertArc(&G, v, w);
InsertArc(&G, w, v); // 无向图需要插入两条边
}
printf("深度优先遍历结果:");
for(i = 0; i < n; i++){
if(!visited[i]){
DFS(G, i, visited);
}
}
printf("\n广度优先遍历结果:");
for(i = 0; i < n; i++){
visited[i] = 0;
}
for(i = 0; i < n; i++){
if(!visited[i]){
BFS(G, i, visited);
}
}
return 0;
}
```
你可以按照如下格式输入图的数据:
```
请输入图的顶点数和边数:5 6
请输入每条边的两个顶点:
0 1
0 2
0 3
1 4
2 4
3 4
```
这个程序会输出图的深度优先遍历和广度优先遍历结果。
阅读全文