C++实现图DFS遍历遇嵌套函数定义错误,请求协助
解决C++图DFS遍历的函数嵌套定义错误
错误原因
标准C++不允许在函数内部定义另一个函数,你在dfs函数里嵌套定义dfs_visit的写法违反了语法规则,这就是编译器提示“Expected ;”的根本原因。另外原代码还存在两个隐性问题:
MAX未定义,需要提前声明常量值dfs_visit(0)写在了dfs_visit函数内部,会触发无限递归
解决方案
方案1:将辅助函数移到外部,传递必要参数
把dfs_visit移到dfs函数外部,通过参数传递图指针、访问数组和当前节点:
#include <iostream> #include <string> using namespace std; // 先定义MAX的具体值,根据需求调整大小 const int MAX = 100; typedef struct Graph { int n; string nodes[MAX]; double ms[MAX][MAX]; }GRAPH; // 外部定义的DFS辅助函数 void dfs_visit(GRAPH* g, int visit[], int u) { cout << g->nodes[u] << " "; visit[u] = 1; for (int v = 0; v < g->n; v++) { // 邻接矩阵非0表示存在边,且节点未被访问 if (g->ms[u][v] != 0 && !visit[v]) { dfs_visit(g, visit, v); } } } void dfs(GRAPH* g) { int visit[MAX] = {0}; // 初始化访问数组为0(未访问) dfs_visit(g, visit, 0); // 从节点0开始DFS遍历 }
方案2:使用C++11及以上的Lambda表达式
如果你的编译器支持C++11或更高标准,可以用Lambda表达式捕获外部变量,避免函数嵌套:
#include <iostream> #include <string> using namespace std; const int MAX = 100; typedef struct Graph { int n; string nodes[MAX]; double ms[MAX][MAX]; }GRAPH; void dfs(GRAPH* g) { int visit[MAX] = {0}; // 定义Lambda表达式,捕获外部的g和visit数组 auto dfs_visit = [&](int u) -> void { cout << g->nodes[u] << " "; visit[u] = 1; for (int v = 0; v < g->n; v++) { if (g->ms[u][v] != 0 && !visit[v]) { dfs_visit(v); } } }; dfs_visit(0); // 启动遍历 }
额外注意事项
- 邻接矩阵是
double类型,判断边是否存在时,建议用g->ms[u][v] != 0而非直接判断g->ms[u][v],避免浮点数精度问题导致误判。 - 如果图是非连通图,当前代码只会遍历节点0所在的连通分量,需要在
dfs函数里循环所有节点,对未访问的节点调用dfs_visit。
内容的提问来源于stack exchange,提问作者Andew Tayloe
相关产品推荐
相关产品推荐

