算法思想:图的广度优先遍历类似于树的广度优先遍历,与树不同的是图中可能存在环,所以需要用visited进行标记。其中最重要的操作是对边结点引出结点的检测、访问、入队操作。
void BFS(int v, ALGraph *G) {
ArcNode *p;
int queue[MAXSIZE], front = 0, rear = 0; //初始化队列
visited[v] = true;
printf("%d ", G->adjlist[v].data);
rear = (rear + 1) % MAXSIZE;
queue[rear] = v;
int j; //用来记录出队元素的下标
while (front!=rear)
{
front = (front + 1) % MAXSIZE;
j = queue[front];
p = G->adjlist[j].first; //顶点引出的第一条边
//访问所有的邻接点(检测、访问、入队)
while (p!=NULL)
{
if (visited[p->adjv]==false)
{
printf("%d ", G->adjlist[p->adjv].data);
visited[p->adjv] = true;
rear = (rear + 1) % MAXSIZE;
queue[rear] = p->adjv;
}
p = p->next;
}
}
}