用c语言写 TODO:找到两个点之间的所有路径 功能描述:从起点位置出发深度优先遍历图g中能访问的各个顶点,找到指定起点到指定终点的路径信息 调用PrintVInfo(graph *g)方法,打印出路径中的顶点信息。 参数说明:g-graph型指针参数 startV-int型起点位置 endV-终点的位置 返回值说明:无
时间: 2024-03-10 12:45:27 浏览: 56
好的,这是一个比较典型的深度优先搜索问题,可以使用递归的方式来实现。下面是一个可能的现,供您参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_VERTICES 100
// 图的邻接表表示
typedef struct node {
int vertex;
struct node *next;
} node;
typedef struct graph {
node *adjList[MAX_VERTICES];
int visited[MAX_VERTICES];
int verticesCount;
} graph;
// 创建新的节点
node *createNode(int v) {
node *newNode = malloc(sizeof(node));
newNode->vertex = v;
newNode->next = NULL;
return newNode;
}
// 创建新的图
graph *createGraph(int verticesCount) {
graph *g = malloc(sizeof(graph));
g->verticesCount = verticesCount;
for (int i = 0; i < verticesCount; i++) {
g->adjList[i] = NULL;
g->visited[i] = 0;
}
return g;
}
// 添加边
void addEdge(graph *g, int src, int dest) {
node *newNode = createNode(dest);
newNode->next = g->adjList[src];
g->adjList[src] = newNode;
}
// 打印路径信息
void printVInfo(graph *g, int startV, int endV, int *path, int pathLen) {
printf("Path found: ");
for (int i = 0; i < pathLen; i++) {
printf("%d ", path[i]);
}
printf("%d\n", endV);
}
// 深度优先搜索递归实现
void dfs(graph *g, int currentV, int endV, int *path, int pathLen) {
// 把当前节点加入路径
path[pathLen] = currentV;
pathLen++;
// 如果找到终点,打印路径
if (currentV == endV) {
printVInfo(g, path[0], endV, path, pathLen);
return;
}
// 标记当前节点已访问
g->visited[currentV] = 1;
// 遍历当前节点的邻居
node *adjList = g->adjList[currentV];
while (adjList != NULL) {
int adjVertex = adjList->vertex;
if (!g->visited[adjVertex]) {
dfs(g, adjVertex, endV, path, pathLen);
}
adjList = adjList->next;
}
// 标记当前节点已访问结束
g->visited[currentV] = 0;
}
// 找到两个点之间的所有路径
void findAllPaths(graph *g, int startV, int endV) {
int path[MAX_VERTICES];
int pathLen = 0;
dfs(g, startV, endV, path, pathLen);
}
// 测试代码
int main() {
int verticesCount = 6;
graph *g = createGraph(verticesCount);
addEdge(g, 0, 1);
addEdge(g, 0, 2);
addEdge(g, 1, 3);
addEdge(g, 2, 3);
addEdge(g, 3, 4);
addEdge(g, 3, 5);
findAllPaths(g, 0, 4);
return 0;
}
```
这段代码实现了一个简单的无向图(图的结构可以通过 `addEdge` 函数进行修改),并通过调用 `findAllPaths` 函数来找到从起点到终点的所有路径。
需要注意的是,这段代码并没有进行错误处理和内存释放,您可以自行进行修改。同时,这段代码可能并不是最优的实现方式,您可以根据实际情况进行修改和优化。
阅读全文