编程实现如下功能: (1)输入无向图的顶点数、边数及各条边的顶点对,建立用邻接表表示的无向图。 (2)对图进行深度优先搜索和广度优先搜索遍历,并分别输出其遍历序列。c语言
时间: 2024-01-21 13:17:00 浏览: 135
以下是使用邻接表表示的无向图的深度优先搜索和广度优先搜索遍历的C语言代码:
```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;
typedef struct {
VertexNode vexs[MAX_VERTEX_NUM]; // 顶点数组
int vexnum, arcnum; // 顶点数和边数
} Graph;
// 创建图
void createGraph(Graph *G) {
printf("请输入顶点数和边数:");
scanf("%d %d", &G->vexnum, &G->arcnum);
// 初始化顶点数组
for (int i = 0; i < G->vexnum; i++) {
G->vexs[i].data = i;
G->vexs[i].firstarc = NULL;
}
// 建立邻接表
printf("请输入每条边的两个顶点:\n");
for (int k = 0; k < G->arcnum; k++) {
int i, j;
scanf("%d %d", &i, &j);
// 添加边(i, j)
ArcNode *arc1 = (ArcNode *)malloc(sizeof(ArcNode));
arc1->adjvex = j;
arc1->nextarc = G->vexs[i].firstarc;
G->vexs[i].firstarc = arc1;
// 添加边(j, i)
ArcNode *arc2 = (ArcNode *)malloc(sizeof(ArcNode));
arc2->adjvex = i;
arc2->nextarc = G->vexs[j].firstarc;
G->vexs[j].firstarc = arc2;
}
}
// 深度优先搜索遍历
void DFS(Graph G, int v, int visited[]) {
printf("%d ", v); // 访问当前顶点
visited[v] = 1; // 标记当前顶点已被访问
ArcNode *p = G.vexs[v].firstarc;
while (p != NULL) { // 遍历v的所有邻接点
int w = p->adjvex;
if (visited[w] == 0) { // 如果w未被访问,则递归访问它
DFS(G, w, visited);
}
p = p->nextarc;
}
}
// 广度优先搜索遍历
void BFS(Graph G, int v, int visited[]) {
int queue[MAX_VERTEX_NUM]; // 定义队列
int front = 0, rear = 0; // 队头和队尾指针
printf("%d ", v); // 访问当前顶点
visited[v] = 1; // 标记当前顶点已被访问
queue[rear++] = v; // 入队
while (front != rear) { // 队列不为空
int w = queue[front++]; // 出队
ArcNode *p = G.vexs[w].firstarc;
while (p != NULL) { // 遍历w的所有邻接点
int u = p->adjvex;
if (visited[u] == 0) { // 如果u未被访问,则访问它并入队
printf("%d ", u);
visited[u] = 1;
queue[rear++] = u;
}
p = p->nextarc;
}
}
}
int main() {
Graph G;
createGraph(&G);
int visited[MAX_VERTEX_NUM] = {0};
printf("深度优先搜索遍历序列:");
for (int i = 0; i < G.vexnum; i++) {
if (visited[i] == 0) {
DFS(G, i, visited);
}
}
printf("\n广度优先搜索遍历序列:");
for (int i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
for (int i = 0; i < G.vexnum; i++) {
if (visited[i] == 0) {
BFS(G, i, visited);
}
}
return 0;
}
```
使用示例:
```
请输入顶点数和边数:5 6
请输入每条边的两个顶点:
0 1
0 2
1 2
1 3
2 3
3 4
深度优先搜索遍历序列:0 1 2 3 4
广度优先搜索遍历序列:0 1 2 3 4
```
阅读全文