用c语言设计一个程序,依次从有向图中的每个顶点深度优先搜索遍历操作;邻接矩阵作为存储结构。算法思想: (1) 定义图的顺序存储结构; (2) 创建有向图,采用邻接矩阵表示(调用CreateDG函数实现),具体实现如下: 输入图的顶点数和边数; 依次输入顶点的信息存入顶点表中; 初始化邻接矩阵,使每个权值初始化为0; 构造邻接矩阵;(需调用LocateVex函数获取顶点在顶点表中的下标) (3) 依次从每个顶点进行深度优先搜索,并输出访问序列(调用DFSTraverse函数实现;另需调用相关函数实现获取第一个和下一个邻接点的操作)。 注意:顶点数据仅为1个数字或1个字符。 输入说明: 第一行输入图的顶点数n和边数m; 第二行依次输入n个顶点的数据; 接下来m行的每行输入一条边的信息。 输出说明: 输出n行,每行输出从第i(0≤i<n)个顶点深度优先搜索的访问序列,序列中的连通分量用{}括起来,无空格间隔,{}为英文半角的符号。
时间: 2023-07-15 17:15:50 浏览: 95
以下是C语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
typedef char VertexType; // 顶点数据类型
typedef int EdgeType; // 边权值类型
typedef struct {
VertexType vexs[MAX_VERTEX_NUM]; // 顶点表
EdgeType arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum, arcnum; // 顶点数和边数
} MGraph;
int LocateVex(MGraph G, VertexType v) // 获取顶点在顶点表中的下标
{
for (int i = 0; i < G.vexnum; i++) {
if (G.vexs[i] == v) {
return i;
}
}
return -1;
}
void CreateDG(MGraph *G) // 创建有向图,采用邻接矩阵表示
{
printf("请输入图的顶点数和边数:");
scanf("%d%d", &(G->vexnum), &(G->arcnum));
printf("请输入%d个顶点的数据:", G->vexnum);
for (int i = 0; i < G->vexnum; i++) {
scanf(" %c", &(G->vexs[i]));
}
for (int i = 0; i < G->vexnum; i++) {
for (int j = 0; j < G->vexnum; j++) {
G->arcs[i][j] = 0; // 初始化邻接矩阵,使每个权值初始化为0
}
}
printf("请输入%d条边的信息:\n", G->arcnum);
for (int k = 0; k < G->arcnum; k++) {
VertexType v1, v2;
printf("请输入第%d条边的两个顶点的数据:", k+1);
scanf(" %c%c", &v1, &v2);
int i = LocateVex(*G, v1);
int j = LocateVex(*G, v2);
if (i >= 0 && j >= 0) {
G->arcs[i][j] = 1; // 构造邻接矩阵
}
}
}
void DFS(MGraph G, int v, int visited[], char path[]) // 深度优先搜索遍历操作
{
visited[v] = 1; // 标记该节点已经被访问
path[strlen(path)] = G.vexs[v]; // 将该节点加入遍历路径中
int flag = 1; // 判断是否存在未访问的邻接节点
for (int i = 0; i < G.vexnum; i++) {
if (G.arcs[v][i] != 0 && visited[i] == 0) { // 存在未访问的邻接节点
flag = 0;
DFS(G, i, visited, path);
}
}
if (flag == 1) { // 不存在未访问的邻接节点,遍历结束
path[strlen(path)] = '}'; // 将遍历路径加上括号
printf("%s\n", path);
}
path[strlen(path)-1] = '\0'; // 回溯,将该节点从遍历路径中删除
}
void DFSTraverse(MGraph G) // 依次从每个顶点进行深度优先搜索,并输出访问序列
{
int visited[MAX_VERTEX_NUM]; // 标记数组,用于记录每个节点是否被访问
memset(visited, 0, sizeof(visited)); // 初始化为0
for (int i = 0; i < G.vexnum; i++) {
if (visited[i] == 0) { // 如果该节点没有被访问过
char path[MAX_VERTEX_NUM] = "{";
DFS(G, i, visited, path); // 从该节点开始进行深度优先搜索
}
}
}
int main()
{
MGraph G;
CreateDG(&G);
DFSTraverse(G);
return 0;
}
```
输入样例:
```
5 6
ABCDE
A B
B C
B D
C E
D E
E A
```
输出样例:
```
{ABDECA}
{BC}
{DE}
{}
{}
```
阅读全文