高手求助!C 数据结构“图广度遍历”有点看不懂?(在线)⊙△⊙

来源:百度知道 编辑:UC知道 时间:2024/05/22 20:05:55
书上有一个非递归广度图的遍历,其中有些地方十分看不懂:

//下面这句第二个参数"Status(*Visit)(int v)"这是什么意思?

void BFSTraverse(Graph G,Status(*Visit)(int v))
{
int u,w;

//下面这句的"v"不就是参数中的"v",这怎么能使用呢?
for(v=0;v<G.venum;++v)
visited[v]=FLASE;
Init_Queue(Q);

//既然"visited[]"中的每个都被标志为FLASE下面这句 "if(!visited[v])"
判断也没用了,if中的语句始终也要执行啊?
if(!visited[v])
{
In_Queue(Q,v);
while(!QueueEmpty(Q))
{
Out_Queue(Q,u);
visited[u]=TRUE;
visit(u);
for(w=FirstAdjVex(G,u);w;w=NextAdjVex(G,u,w))
if(!visited[w])
In_Queue(Q,w);
}
}
}

void BFSTraverse(Graph G,Status(*Visit)(int v))第二个参数实在不知道是什么意思。

for(v=0;v<G.venum;++v) 是不是印错了,错拿"v"做for语句里的变量

if(!visited[v]) 这个判断始终没用啊?

上面这几句头都看大了,高手帮我分析一下,多谢了、、、

那个V应该是你用数组存节点的地址,它是另建个visited数组,跟节点相对应的,1对1,2对2.而那个把VISITED先都置为FALSE是因为后面BFS的时候避免重复访问已访问过的节点,你可以好好体会一下,if不是始终执行的,因为它访问过一个节点就将它置为true了。
void BFSTraverse(Graph G,Status(*Visit)(int v))第二个参数实在不知道是什么意思。
第二个参数是伪代码的形式,status是你自己定义的一个状态比如无返回值就定义为void,v我已经说过了。
下面那个for循环是保证访问图中所有的节点,比如你有几个点不是都联通的,它第一次BFS的时候就访问不到他,也就不会变为TRUE了,所以要循环一下,保证都访问。