C语言编程实现如下功能: (1)输入无向图的顶点数、边数及各条边的顶点对,建立用邻接表表示的无向图。 (2)对图进行深度优先搜索和广度优先搜索遍历,并分别输出其遍历序列。
时间: 2024-02-15 11:04:31 浏览: 73
好的,我可以帮你解答这个问题。
以下是 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 {
int data; // 顶点信息
ArcNode *firstarc; // 指向第一条依附该顶点的边的指针
} VNode;
// 图
typedef struct {
VNode adjlist[MAX_VERTEX_NUM]; // 邻接表
int vexnum; // 顶点数
int arcnum; // 边数
} Graph;
// 初始化图
void InitGraph(Graph *G) {
printf("请输入顶点数和边数:");
scanf("%d%d", &G->vexnum, &G->arcnum);
getchar(); // 处理回车符
printf("请输入各个顶点的信息:\n");
for (int i = 0; i < G->vexnum; i++) {
printf("第 %d 个顶点:", i + 1);
scanf("%d", &G->adjlist[i].data);
G->adjlist[i].firstarc = NULL;
}
int v1, v2;
ArcNode *p;
printf("请输入各个边的信息:\n");
for (int i = 0; i < G->arcnum; i++) {
printf("第 %d 条边:", i + 1);
scanf("%d%d", &v1, &v2);
p = (ArcNode *) malloc(sizeof(ArcNode));
p->adjvex = v2 - 1;
p->next = G->adjlist[v1 - 1].firstarc;
G->adjlist[v1 - 1].firstarc = p;
p = (ArcNode *) malloc(sizeof(ArcNode));
p->adjvex = v1 - 1;
p->next = G->adjlist[v2 - 1].firstarc;
G->adjlist[v2 - 1].firstarc = p;
}
}
// 深度优先遍历
void DFS(Graph G, int v, int *visited) {
visited[v] = 1;
printf("%d ", G.adjlist[v].data);
ArcNode *p = G.adjlist[v].firstarc;
while (p) {
if (!visited[p->adjvex]) {
DFS(G, p->adjvex, visited);
}
p = p->next;
}
}
// 深度优先遍历(非递归)
void DFS_NonRecursive(Graph G, int v, int *visited) {
int stack[MAX_VERTEX_NUM]; // 定义栈
int top = 0;
stack[top++] = v; // 入栈
while (top > 0) {
int w = stack[--top]; // 出栈
if (!visited[w]) {
visited[w] = 1;
printf("%d ", G.adjlist[w].data);
ArcNode *p = G.adjlist[w].firstarc;
while (p) {
if (!visited[p->adjvex]) {
stack[top++] = p->adjvex; // 入栈
}
p = p->next;
}
}
}
}
// 广度优先遍历
void BFS(Graph G, int v, int *visited) {
int queue[MAX_VERTEX_NUM]; // 定义队列
int front = 0, rear = 0;
printf("%d ", G.adjlist[v].data);
visited[v] = 1;
queue[rear++] = v; // 入队
while (front < rear) {
int w = queue[front++]; // 出队
ArcNode *p = G.adjlist[w].firstarc;
while (p) {
if (!visited[p->adjvex]) {
printf("%d ", G.adjlist[p->adjvex].data);
visited[p->adjvex] = 1;
queue[rear++] = p->adjvex; // 入队
}
p = p->next;
}
}
}
int main() {
Graph G;
InitGraph(&G);
int visited[MAX_VERTEX_NUM] = {0}; // 初始化为未访问
printf("深度优先遍历序列:");
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
DFS(G, i, visited);
}
}
printf("\n");
for (int i = 0; i < G.vexnum; i++) {
visited[i] = 0; // 初始化为未访问
}
printf("广度优先遍历序列:");
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
BFS(G, i, visited);
}
}
printf("\n");
return 0;
}
```
这段代码中,我们首先通过输入顶点数、边数及各条边的顶点对来建立用邻接表表示的无向图。然后,我们分别使用深度优先搜索和广度优先搜索遍历图,并输出它们的遍历序列。
需要注意的是,我们使用了递归和非递归两种方式实现深度优先搜索遍历,其中非递归方式使用了栈来模拟递归过程。此外,我们还使用了队列来实现广度优先搜索遍历。
阅读全文