关于数据结构中 图的深度遍历算法 有几处疑问 希望大侠解答 不胜感激
Boolenvisited[MAX];//访问标志数组Status(*VisitFunc)(intv);//函数变量voidDFSTraverse(GraphG,Stat...
Boolen visited[MAX]; //访问标志数组
Status(*VisitFunc)(int v); //函数变量
void DFSTraverse(Graph G,Status(*Visit)(int v)){
//对图G作深度优先遍历
VisitFunc =Visit; //使用全局变量VisitFunc,使DFS不必设函数指针参数(这句话的注释没太明白 函数指针参数指什么?)
for(v=0;v<G.vexnum;++v) visited[v] =FALSE;//访问标志数组初始化
for(v=0;v<G.vexnum;++v)
if(!visited[v]) DFS(G,v); //对尚未访问的顶点调用DFS (疑问:这一句话的意思是不是顶点visited[v]如果未被访问,调用DFS? 可是刚才初始化的时候visited[v]已经被赋予FALSE值了 如果!visited[v]岂不是表示 true的意思 那不就是被访问过了吗?)
}
后面定义DFS的算法就不写了 主要就是上面说的两点不太明白 希望友人能帮我解答下 最好详细直白点 我新学数据结构 再次谢谢啦 展开
Status(*VisitFunc)(int v); //函数变量
void DFSTraverse(Graph G,Status(*Visit)(int v)){
//对图G作深度优先遍历
VisitFunc =Visit; //使用全局变量VisitFunc,使DFS不必设函数指针参数(这句话的注释没太明白 函数指针参数指什么?)
for(v=0;v<G.vexnum;++v) visited[v] =FALSE;//访问标志数组初始化
for(v=0;v<G.vexnum;++v)
if(!visited[v]) DFS(G,v); //对尚未访问的顶点调用DFS (疑问:这一句话的意思是不是顶点visited[v]如果未被访问,调用DFS? 可是刚才初始化的时候visited[v]已经被赋予FALSE值了 如果!visited[v]岂不是表示 true的意思 那不就是被访问过了吗?)
}
后面定义DFS的算法就不写了 主要就是上面说的两点不太明白 希望友人能帮我解答下 最好详细直白点 我新学数据结构 再次谢谢啦 展开
1个回答
展开全部
1、简单说一下:在程序中有时候有的自定义函数功能很类似,比如求两个数的和,那么对于整数可以写一个函数,而对于小数也可以写一个函数,这两个函数的格式,参数啦等基本一致,只不过是参数的数字形态不一样。所以可以定义一个函数参数指针,用来被赋值为一个自定义函数名,代替它来调用对应的函数。类似于构造函数的调用。有参和无参,或者自动识别参数类型来调用不同的同名函数。
2、这是你的理解问题了。程序的任务就是去遍历这些顶点。那刚才初始化的时候visited[v]已经被赋予FALSE值了并不代表被访问了。访问是按照一定的规则顺序找元素的。而初始化仅仅是给所有顶点都做好标记,不是规则上的顺序访问。
现在要是检测到visited[v]为FALSE,而,这正好代表了这个顶点没有被访问啊,要是visited[v]为true,那么!visited[v]不就是FALSE了吗,那if后面的dfs不是不需要执行了,不也就代表了顶点被访问过了吗。
2、这是你的理解问题了。程序的任务就是去遍历这些顶点。那刚才初始化的时候visited[v]已经被赋予FALSE值了并不代表被访问了。访问是按照一定的规则顺序找元素的。而初始化仅仅是给所有顶点都做好标记,不是规则上的顺序访问。
现在要是检测到visited[v]为FALSE,而,这正好代表了这个顶点没有被访问啊,要是visited[v]为true,那么!visited[v]不就是FALSE了吗,那if后面的dfs不是不需要执行了,不也就代表了顶点被访问过了吗。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询