📅  最后修改于: 2023-12-03 15:27:11.808000             🧑  作者: Mango
当你需要判断一个有向图是否存在循环时,可以使用以下C程序来实现。
利用深度优先遍历算法(DFS)来遍历有向图,同时利用一个visited数组用于记录遍历过的节点,以此来判断当前遍历节点是否已被遍历过,从而判断是否存在循环。
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 顶点的最大个数
typedef struct {
int vertex[MAX_VERTEX_NUM];
int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vertexNum;
int arcNum;
} Graph; // 图的结构体定义
int visited[MAX_VERTEX_NUM];
void createGraph(Graph *g) { // 创建图
int i, j, k;
printf("请输入顶点数:");
scanf("%d", &(g->vertexNum));
printf("请输入边数:");
scanf("%d", &(g->arcNum));
printf("请输入顶点信息:\n");
for (i = 0; i < g->vertexNum; ++i) {
scanf("%d", g->vertex + i);
}
for (i = 0; i < g->vertexNum; ++i) {
for (j = 0; j < g->vertexNum; ++j) {
g->arc[i][j] = 0;
}
}
printf("请输入边信息(起点,终点):\n");
for (k = 0; k < g->arcNum; ++k) {
scanf("%d,%d", &i, &j);
g->arc[i][j] = 1;
}
}
void DFS(Graph*g, int num) { //深度优先遍历
int k;
visited[num] = 1;
printf("%d\t", g->vertex[num]);
for (k = 0; k < g->vertexNum; ++k) {
if (g->arc[num][k] != 0 && visited[k] == 0) {
DFS(g, k);
}
}
}
int checkLoop(Graph* g) { // 判断是否存在循环
int i;
for (i = 0; i < g->vertexNum; ++i) {
visited[i] = 0;
}
for (i = 0; i < g->vertexNum; ++i) {
if (visited[i] == 0) {
DFS(g, i);
}
else {
return 1;
}
}
return 0;
}
void destroyGraph(Graph *g) { // 销毁图
g->arcNum = 0;
g->vertexNum = 0;
}
int main() {
Graph g;
int isLoop;
createGraph(&g);
isLoop = checkLoop(&g);
if (isLoop) {
printf("存在循环!\n");
}
else {
printf("不存在循环!\n");
}
destroyGraph(&g);
return 0;
}
定义了一个结构体Graph,用于存储图的数据信息。参数包括:
函数参数:Graph*
函数功能:创建有向图
实现过程:输入顶点和边的信息,构建图的数据结构
函数参数:Graph*,int
函数功能:深度优先遍历顶点
实现过程:遍历顶点,并标记已访问的顶点
函数参数:Graph*
函数功能:判断是否存在循环
实现过程:利用深度优先遍历算法(DFS)遍历有向图,同时利用一个visited数组用于记录遍历过的节点,以此来判断当前遍历节点是否已被遍历过,从而判断是否存在循环。
函数参数:Graph*
函数功能:销毁有向图
实现过程:释放图的数据占用的内存空间
输入如下数据:
请输入顶点数:4
请输入边数:4
请输入顶点信息:
0 1 2 3
请输入边信息(起点,终点):
0,1
0,2
1,2
2,0
输出结果:
存在循环!
以上就是检测有向图循环的C程序的实现过程和测试。通过深度优先遍历算法,能够快速、准确地检测图的循环情况,给程序员提供了一种方便快捷的工具。