编程实现如下功能: (1)输入无向图的顶点数、边数及各条边的顶点对,建立用邻接表表示的无向图。 (2)对图进行深度优先搜索和广度优先搜索遍历,并分别输出其遍历序列。要求用c语言实现
时间: 2024-02-05 16:11:23 浏览: 64
以下是使用邻接表表示的无向图进行深度优先搜索和广度优先搜索的c语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100 // 最大顶点数
typedef struct EdgeNode { // 边表结点
int adjvex; // 邻接点域,存储该顶点对应的下标
struct EdgeNode* next; // 链域,指向下一个邻接点
} EdgeNode;
typedef struct VertexNode { // 顶点表结点
char data; // 存储顶点信息
EdgeNode* firstedge; // 边表头指针
} VertexNode, AdjList[MAXVEX];
typedef struct { // 邻接表
AdjList adjList;
int numVertexes, numEdges; // 图中当前顶点数和边数
} GraphAdjList;
int visited[MAXVEX]; // 记录顶点是否被访问过,初始值为0
// 创建图的邻接表
void CreateALGraph(GraphAdjList* G) {
int i, j, k;
EdgeNode* e;
printf("请输入图的顶点数和边数:");
scanf_s("%d %d", &G->numVertexes, &G->numEdges);
getchar();
printf("请输入图的各个顶点信息:\n");
for (i = 0; i < G->numVertexes; i++) {
scanf_s("%c", &G->adjList[i].data, 1);
G->adjList[i].firstedge = NULL;
getchar();
}
printf("请输入各条边的顶点对:\n");
for (k = 0; k < G->numEdges; k++) {
char v1, v2;
printf("第%d条边:", k + 1);
scanf_s("%c %c", &v1, 1, &v2, 1);
getchar();
for (i = 0; i < G->numVertexes; i++) {
if (G->adjList[i].data == v1) {
break;
}
}
for (j = 0; j < G->numVertexes; j++) {
if (G->adjList[j].data == v2) {
break;
}
}
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = j;
e->next = G->adjList[i].firstedge;
G->adjList[i].firstedge = e;
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = i;
e->next = G->adjList[j].firstedge;
G->adjList[j].firstedge = e;
}
}
// 深度优先搜索遍历图
void DFS(GraphAdjList* G, int i) {
EdgeNode* p;
visited[i] = 1;
printf("%c ", G->adjList[i].data); // 访问顶点
p = G->adjList[i].firstedge; // 指向第一个邻接点
while (p) {
if (!visited[p->adjvex]) {
DFS(G, p->adjvex); // 对未访问过的邻接点进行递归调用
}
p = p->next;
}
}
// 广度优先搜索遍历图
void BFS(GraphAdjList* G, int i) {
int queue[MAXVEX], front = 0, rear = 0;
int j;
EdgeNode* p;
printf("%c ", G->adjList[i].data);
visited[i] = 1;
queue[rear++] = i;
while (front != rear) {
j = queue[front++];
p = G->adjList[j].firstedge;
while (p) {
if (!visited[p->adjvex]) {
printf("%c ", G->adjList[p->adjvex].data);
visited[p->adjvex] = 1;
queue[rear++] = p->adjvex;
}
p = p->next;
}
}
}
int main() {
GraphAdjList G;
CreateALGraph(&G);
printf("深度优先搜索序列:");
for (int i = 0; i < G.numVertexes; i++) {
if (!visited[i]) {
DFS(&G, i);
}
}
printf("\n");
for (int i = 0; i < G.numVertexes; i++) {
visited[i] = 0; // 重置visited数组为0
}
printf("广度优先搜索序列:");
for (int i = 0; i < G.numVertexes; i++) {
if (!visited[i]) {
BFS(&G, i);
}
}
printf("\n");
return 0;
}
```
以上代码实现了深度优先搜索和广度优先搜索遍历邻接表表示的无向图,并输出遍历序列。其中,visited数组用于记录顶点是否被访问过,DFS函数和BFS函数分别实现了深度优先搜索和广度优先搜索的过程。
阅读全文