C语言设计一个程序,采用交互方式建立一个无向图的邻接表表示,输入顶点数和边数,输入边的信息,并输出该图的深度优先搜索遍历得到的顶点序列。
时间: 2023-06-19 08:10:08 浏览: 96
以下是一个基于邻接表表示的无向图的深度优先搜索遍历的 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; // 图中当前的顶点数
int numEdges; // 图中当前的边数
} GraphAdjList;
// 创建图的邻接表结构
void CreateALGraph(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("请输入边的信息(vi, vj):\n");
for (k = 0; k < G->numEdges; k++) {
scanf("%d%d", &i, &j); // 输入边依附的顶点编号
// 新建一个边表结点
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = j;
// 将新建的边表结点插入到顶点i的边表头部
e->next = G->adjList[i].firstedge;
G->adjList[i].firstedge = e;
// 由于是无向图,还需插入到顶点j的边表头部
e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->adjvex = i;
e->next = G->adjList[j].firstedge;
G->adjList[j].firstedge = e;
}
}
// DFS递归算法
void DFS(GraphAdjList* G, int i, int* visited) {
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, visited);
}
p = p->next;
}
}
// 深度优先搜索遍历图
void DFSTraverse(GraphAdjList* G) {
int i;
int visited[MAXVEX];
for (i = 0; i < G->numVertexes; i++) {
visited[i] = 0; // 初始化访问标记
}
printf("DFS遍历序列:");
for (i = 0; i < G->numVertexes; i++) {
if (!visited[i]) {
DFS(G, i, visited);
}
}
printf("\n");
}
int main() {
GraphAdjList G;
CreateALGraph(&G);
DFSTraverse(&G);
return 0;
}
```
该程序首先根据用户输入的顶点数和边数,创建一个邻接表表示的无向图,然后通过深度优先搜索算法遍历该图,并输出遍历到的顶点序列。
注意,在创建图的过程中,由于是无向图,所以需要同时在两个顶点的边表头部插入边表结点。在深度优先搜索算法中,我们使用递归函数实现。首先将当前访问的顶点标记为已访问,并打印该顶点信息,然后依次访问该顶点的所有邻接点,如果邻接点未被访问,则递归访问该邻接点。最后,在主函数中调用 `DFSTraverse` 函数遍历该图。
阅读全文