希望求大神给我详细解释一下这个程序 C语言的

源程序实在是太长了 只能提供一个网址 http://hi.baidu.com/olhfhvkuvbbeqrd/item/f93945a9475a173c030a4dd9
希望大神详细简单的解释一下广度遍历那段算法的意思 尤其是 while(!quempty(q))
{
int u,w;
u=dequeue(q);
for(w=firstadjvex(g,u);w>0;w=nextadjvex(g,u,w))
{
if(!visited[w])
{
visited[w]=1;
visitvex(g,w);
enqueue(q,w);
}
}
}
这一段 实在是看不懂 小弟现在也没有多少分了 只能先意思着了
我先说一下 这个程序是老师给我们的,之前老师也没有教原理 完全让我们自己解释这个程序是如何运行的 以后如果有朋友和我一样对这个程序有疑问的话,可以告诉你们,这个程序应该是有错的
至于楼底下的,我不知道你从哪里看出来我不懂得队列,我不懂得广度遍历的,但我知道你绝对没有细看程序就在那里说,你说你每一句话都是在解释代码,但是你就没有发现这个程序有问题吗,看问题了吗?你看程序了吗?你看空间里的原程序了吗?
这段程序中,“while(!quempty(q))” 这句语句应该是源于课本上的 但是 课本上的是一个函数QueueEmpty 这个函数针对的是空队列返回TRUE,否则返回FALSE;但是这段程序里是/*判断队列是否为空*/
int quempty(Queue *q)
if(q->front==q->rear)
return 0;
else
return 1;
我不知道你是从哪里来的信心说是一句一句解释的,反正我是看不出来你解释的是哪一句。当然,还有其他的问题还是请你这个”犬神“自己找吧!!!

第1个回答  2014-05-27
如果你提问里说了,代码是你写的,你要帮忙查错,我自然给你查错。
你只是让人解释什么是广度优先遍历,我为何要检查队列判空的代码?既然是老师给你留的作业,代码正确与否是你自己检测的任务,你提问要求解释的是概念,是代码的意思,不是代码的对错。敢问如果你提前运行了,你知道代码是有错误的话,你为什么没有在提问里说明代码有错误?
然后再请问,你现在理解什么是广度优先了么?那如果理解了的话,你来给我讲讲这段代码是什么意思,我看看你是怎么讲的,你认为什么样的回答算是回答了你的问题?
再重复一遍,你提问的是,解释广度优先那一段代码的意思。

我说的都是套话么?如果你都懂,你懂什么是队列的话,你就应该知道队列就是广度优先遍历中最佳的数据结构,它是让图个一个起点好像圆心一样,一圈一圈的访问所有图的其他节点。为什么叫广度优先,就是因为它像水纹一样访问图,而不是一条道走到黑。

从这段代码来看,图的存储用的是邻接表,for循环就是从连接表里取出队头元素的所有邻接点,放入队列,并设置为已访问。我不觉得你真的懂我下面说的那些,否则你不会问出队列的作用是什么,队列的作用,就是保证这个遍历算法是广度优先的。先入队的先访问,还要说什么?

我下面说的每一段话都是一句一句解释代码的意思了,拜托你能不能先有点儿知识,好好看看别人说了什么,好好弄明白自己什么叫懂,什么叫不懂,再提问型么?

图的广度优先遍历,依靠队列这个数据结构的先进先出的性质。
从一个顶点出发,先把这个顶点的所有邻接的点中,没有被访问过的顶点放入队列,并将这些顶点标记为已访问,执行一些访问的操作。
然后从队列里取出队头的元素,将队头元素的所有邻接的点中,没有被访问的顶点放入队列。重复这些,直到访问了所有顶点。
你不妨做一个图来试试看,你就能理解了。当然你一定要先学习一下队列这个数据结构,如果你不懂队列的话。本回答被提问者采纳