用c语言编程实现如下功能:用邻接表作为图的存储结构建立一个图,并对此图分别进行深度优先搜索和广度优先搜索遍历。(1)输入无向图的顶点数、边数及各条边的顶点对,建立用邻接表表示的无向图。 (2)对图进行深度优先搜索和广度优先搜索遍历,并分别输出其遍历序列。
时间: 2024-02-03 14:12:42 浏览: 89
数据结构课程设计 图的遍历问题
以下是用C语言编写的实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 边表结构体
typedef struct ArcNode {
int adjvex; // 邻接点编号
struct ArcNode *next; // 指向下一个边结点的指针
} ArcNode;
// 顶点表结构体
typedef struct VNode {
char data; // 顶点数据
ArcNode *firstarc; // 指向第一个边结点的指针
} VNode, AdjList[MAX_VERTEX_NUM];
// 图的结构体
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 顶点数和边数
} ALGraph;
// 初始化邻接表
void init(ALGraph *G, int vexnum) {
for (int i = 0; i < vexnum; i++) {
G->vertices[i].data = 'A' + i; // 顶点编号从0开始,对应字母从A开始
G->vertices[i].firstarc = NULL; // 初始化每个顶点的边表为空
}
}
// 创建邻接表
void create(ALGraph *G, int arcnum) {
for (int i = 0; i < arcnum; i++) {
int v1, v2;
printf("请输入第%d条边的两个顶点编号(用空格隔开):", i + 1);
scanf("%d%d", &v1, &v2);
// 新建边结点
ArcNode *p = (ArcNode *) malloc(sizeof(ArcNode));
p->adjvex = v2;
p->next = G->vertices[v1].firstarc; // 将新结点插入到v1的边表头部
G->vertices[v1].firstarc = p;
// 由于是无向图,所以同时要建立从v2到v1的边
p = (ArcNode *) malloc(sizeof(ArcNode));
p->adjvex = v1;
p->next = G->vertices[v2].firstarc; // 将新结点插入到v2的边表头部
G->vertices[v2].firstarc = p;
}
}
// 深度优先搜索遍历
void DFS(ALGraph G, int v, int visited[]) {
visited[v] = 1; // 标记v已经被访问
printf("%c ", G.vertices[v].data); // 输出顶点v的数据
ArcNode *p = G.vertices[v].firstarc;
while (p != NULL) {
int w = p->adjvex;
if (visited[w] == 0) { // 如果w未被访问
DFS(G, w, visited); // 递归访问w
}
p = p->next;
}
}
// 深度优先搜索
void DFSTraverse(ALGraph G) {
int visited[MAX_VERTEX_NUM] = {0}; // 初始化visited数组
for (int v = 0; v < G.vexnum; v++) {
if (visited[v] == 0) { // 如果v未被访问
DFS(G, v, visited); // 从v开始深度优先搜索
}
}
}
// 广度优先搜索遍历
void BFS(ALGraph G, int v, int visited[]) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0;
visited[v] = 1; // 标记v已经被访问
printf("%c ", G.vertices[v].data); // 输出顶点v的数据
queue[rear++] = v; // 将v入队
while (front != rear) { // 队列不为空
int w = queue[front++]; // 取出队头元素w
ArcNode *p = G.vertices[w].firstarc;
while (p != NULL) {
int u = p->adjvex;
if (visited[u] == 0) { // 如果u未被访问
visited[u] = 1; // 标记u已经被访问
printf("%c ", G.vertices[u].data); // 输出顶点u的数据
queue[rear++] = u; // 将u入队
}
p = p->next;
}
}
}
// 广度优先搜索
void BFSTraverse(ALGraph G) {
int visited[MAX_VERTEX_NUM] = {0}; // 初始化visited数组
for (int v = 0; v < G.vexnum; v++) {
if (visited[v] == 0) { // 如果v未被访问
BFS(G, v, visited); // 从v开始广度优先搜索
}
}
}
int main() {
ALGraph G;
int vexnum, arcnum;
printf("请输入无向图的顶点数和边数(用空格隔开):");
scanf("%d%d", &vexnum, &arcnum);
G.vexnum = vexnum;
G.arcnum = arcnum;
init(&G, vexnum);
create(&G, arcnum);
printf("深度优先搜索遍历序列:");
DFSTraverse(G);
printf("\n");
printf("广度优先搜索遍历序列:");
BFSTraverse(G);
printf("\n");
return 0;
}
```
使用示例:
```
请输入无向图的顶点数和边数(用空格隔开):5 6
请输入第1条边的两个顶点编号(用空格隔开):0 1
请输入第2条边的两个顶点编号(用空格隔开):0 2
请输入第3条边的两个顶点编号(用空格隔开):1 2
请输入第4条边的两个顶点编号(用空格隔开):1 3
请输入第5条边的两个顶点编号(用空格隔开):2 4
请输入第6条边的两个顶点编号(用空格隔开):3 4
深度优先搜索遍历序列:A B C D E
广度优先搜索遍历序列:A B C D E
```
阅读全文