C语言输入无向图的顶点数、边数及各条边的顶点对,建立用邻接表表示的无向图。 对图进行深度优先搜索和广度优先搜索遍历,并分别输出其遍历序列
时间: 2024-02-09 15:08:42 浏览: 77
数据结构实验3
好的,以下是C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 邻接表节点结构体
typedef struct ArcNode {
int adjvex; // 该边所指向的顶点的位置
struct ArcNode *next; // 指向下一条边的指针
} ArcNode;
// 顶点表结构体
typedef struct VertexNode {
int data; // 顶点信息
ArcNode *first; // 指向第一条依附该顶点的边的指针
} VertexNode;
// 邻接表结构体
typedef struct {
VertexNode vertex[MAX_VERTEX_NUM]; // 顶点表
int vexnum, arcnum; // 图的当前顶点数和边数
} AdjList;
// 初始化邻接表
void InitAdjList(AdjList *G) {
int i;
G->vexnum = G->arcnum = 0;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
G->vertex[i].data = 0;
G->vertex[i].first = NULL;
}
}
// 添加边
void AddEdge(AdjList *G, int u, int v) {
ArcNode *p;
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = v;
p->next = G->vertex[u].first;
G->vertex[u].first = p;
}
// 深度优先搜索遍历
void DFS(AdjList *G, int v, int *visited) {
ArcNode *p;
printf("%d ", v);
visited[v] = 1;
p = G->vertex[v].first;
while (p != NULL) {
if (!visited[p->adjvex]) {
DFS(G, p->adjvex, visited);
}
p = p->next;
}
}
// 广度优先搜索遍历
void BFS(AdjList *G, int v, int *visited) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0;
ArcNode *p;
printf("%d ", v);
visited[v] = 1;
queue[rear++] = v;
while (front < rear) {
v = queue[front++];
p = G->vertex[v].first;
while (p != NULL) {
if (!visited[p->adjvex]) {
printf("%d ", p->adjvex);
visited[p->adjvex] = 1;
queue[rear++] = p->adjvex;
}
p = p->next;
}
}
}
int main() {
AdjList G;
int visited[MAX_VERTEX_NUM] = {0}; // 初始化为0
int i, u, v;
// 初始化邻接表
InitAdjList(&G);
// 输入无向图的顶点数和边数
scanf("%d %d", &G.vexnum, &G.arcnum);
// 输入各条边的顶点对,建立邻接表
for (i = 0; i < G.arcnum; i++) {
scanf("%d %d", &u, &v);
AddEdge(&G, u, v);
AddEdge(&G, v, u);
}
// 输出邻接表
for (i = 0; i < G.vexnum; i++) {
printf("%d: ", i);
ArcNode *p = G.vertex[i].first;
while (p != NULL) {
printf("%d ", p->adjvex);
p = p->next;
}
printf("\n");
}
// 深度优先搜索遍历
printf("DFS: ");
for (i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
DFS(&G, i, visited);
}
}
printf("\n");
// 广度优先搜索遍历
for (i = 0; i < G.vexnum; i++) {
visited[i] = 0; // 重置visited数组
}
printf("BFS: ");
for (i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
BFS(&G, i, visited);
}
}
printf("\n");
return 0;
}
```
代码中,`AdjList`代表邻接表,`ArcNode`代表邻接表节点,`VertexNode`代表顶点表节点。`InitAdjList`函数用于初始化邻接表,`AddEdge`函数用于添加边,`DFS`函数和`BFS`函数分别用于深度优先搜索遍历和广度优先搜索遍历。在`main`函数中,我们先输入无向图的顶点数和边数,再输入各条边的顶点对,建立邻接表。然后,我们输出邻接表,并进行深度优先搜索遍历和广度优先搜索遍历,并输出它们的遍历序列。
阅读全文