编程实现如下功能: (1)输入无向图的顶点数、边数及各条边的顶点对,建立用邻接表表示的无向图。 (2)对图进行深度优先搜索和广度优先搜索遍历,并分别输出其遍历序列。要求用c语言实现
时间: 2024-02-03 08:15:18 浏览: 28
以下是用 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]; // 记录访问过的结点
// 创建邻接表结构的无向图
void CreateGraph(GraphAdjList *G) {
int i, j, k;
EdgeNode *e;
printf("请输入顶点数和边数:\n");
scanf("%d%d", &G->numVertexes, &G->numEdges);
printf("请输入顶点信息:\n");
for (i = 0; i < G->numVertexes; i++) {
scanf(" %c", &G->adjList[i].data);
G->adjList[i].firstedge = NULL;
}
printf("请输入边信息(顶点下标从0开始):\n");
for (k = 0; k < G->numEdges; k++) {
scanf("%d%d", &i, &j);
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 != NULL) {
if (!visited[p->adjvex]) {
DFS(G, p->adjvex);
}
p = p->next;
}
}
// 邻接表的深度优先遍历操作
void DFSTraverse(GraphAdjList G) {
int i;
for (i = 0; i < G.numVertexes; i++) {
visited[i] = 0;
}
printf("深度优先遍历序列:");
for (i = 0; i < G.numVertexes; i++) {
if (!visited[i]) {
DFS(G, i);
}
}
printf("\n");
}
// 邻接表的广度优先遍历操作
void BFSTraverse(GraphAdjList G) {
int i, j;
EdgeNode *p;
int queue[MAXVEX], front = 0, rear = 0; // 队列
for (i = 0; i < G.numVertexes; i++) {
visited[i] = 0;
}
printf("广度优先遍历序列:");
for (i = 0; i < G.numVertexes; i++) {
if (!visited[i]) {
visited[i] = 1;
printf("%c ", G.adjList[i].data);
queue[rear++] = i;
while (front != rear) { // 队列非空
j = queue[front++];
p = G.adjList[j].firstedge;
while (p != NULL) {
if (!visited[p->adjvex]) {
visited[p->adjvex] = 1;
printf("%c ", G.adjList[p->adjvex].data);
queue[rear++] = p->adjvex;
}
p = p->next;
}
}
}
}
printf("\n");
}
int main() {
GraphAdjList G;
CreateGraph(&G);
DFSTraverse(G);
BFSTraverse(G);
return 0;
}
```
上述代码实现了邻接表结构的无向图的创建、深度优先搜索遍历和广度优先搜索遍历,其中深度优先遍历使用递归算法实现,广度优先遍历使用队列实现。