#include "bfs.h"
/*
* 从顶点V出发进行广度优先搜索。
* 函数BFS应从编号为V的顶点出发广度优先遍历图,
* 遍历访问邻接点时,要求按序号递增的顺序。
* 题目保证V是图中的合法顶点。
*/
void BFS(AdjGraph * G, VertexType V) {
/*******************begin*******************/
int w, i;
ArcNode * p;
queue < int > q;
int visited[MAXV];
for(i=0;i<G->n;i++) visited[i]=0;//访问标记数组的初始化
printf(" %d",V);
visited[V] = 1; //将顶点 V 的访问标志置为 1
//将顶点 V 入队列;
q.push(V);
while (!q.empty()) {
//取出队列头的顶点, 设为 w
w=q.front();
q.pop();
p = G->adjlist[w].firstarc;//进入 w 链表第一个边结点
while (p !=NULL) {
//设指针 p 所指向的边结点所表示的边的另一个顶点为顶点 j
if (visited[p->adjvex]==0) {
printf("%2d",p->adjvex);
//将 邻接顶点 的访问标志置为 1
visited[p->adjvex]=1;
//将顶点 p->adjvex 入队列
q.push(p->adjvex);
}
p = p->nextarc; //p 移向下一个边结点
} //end of while
} //end of while
/*******************end*******************/
}
int main() {
AdjGraph * G;
VertexType V;
G = CreateGraph();
scanf("%d", & V);
printf("BFS from %d:", V);
BFS(G, V);
return 0;
}
以下是期末考试题
#include "graph.h"
#include <stdio.h>
#include <stdlib.h>
#include<queue>
using namespace std;
void CreateAdj(AdjGraph *&G,int A[MAXV][MAXV],int n,int e) //创建图的邻接表
{
int i,j;
ArcNode *p;
G=(AdjGraph *)malloc(sizeof(AdjGraph));
for(i=0;i<n;i++) //给邻接表的头元素的指针域置初值
{
G->adjlist[i].firstarc=NULL;
}
for(i=0;i<n;i++) //检查邻接表的每个元素
{
for(j=n-1;j>=0;j--)
{
if(A[i][j]!=0&&A[i][j]!=INF) //存在一条边
{
p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个结点p
p->adjvex=j; //存放邻接点
p->weight=A[i][j]; //存放权
p->nextarc=G->adjlist[i].firstarc; //采用头插法插入结点p
G->adjlist[i].firstarc=p;
}
}
}
G->n=n;
G->e=e;
}
void DispAdj(AdjGraph *G)
{
int i;
ArcNode *p;
for(i=0;i<G->n;i++)
{
p=G->adjlist[i].firstarc;
printf("%3d: ",i);
while(p!=NULL)
{
printf("%d[%d]→",p->adjvex,p->weight);
p=p->nextarc;
}
printf("^\n");
}
}
void DestroyAdj(AdjGraph *&G)
{
int i;
ArcNode *pre,*p;
for(i=0;i<G->n;i++) //扫描所有单链表
{
pre=G->adjlist[i].firstarc; //p指向第i个单链表的头结点
if(pre!=NULL)
{
p=pre->nextarc;
while(p!=NULL) //释放第i个单链表的所有结点
{
free(pre);
pre=p;
p=p->nextarc;
}
free(pre);
}
}
free(G);
}
//广度优先遍历
void BFS(AdjGraph *G,int v)
{
/********** Begin **********/
int w, i;
ArcNode * p;//邻边
queue < int > q;
int visited[MAXV];//是否访问
for(i=0;i<G->n;i++) visited[i]=0;//访问标记数组的初始化
printf("%d",v);
visited[v] = 1; //将顶点 i 的访问标志置为 1
//将顶点 V 入队列;
q.push(v);
while (!q.empty()) {
//取出队列头的顶点, 设为 k
w=q.front();
q.pop();
p = G->adjlist[w].firstarc;
while (p !=NULL) {
//设指针 p 所指向的边结点所表示的边的另一个顶点为顶点 j
if (visited[p->adjvex]==0) {
printf("%2d",p->adjvex);
//将顶点 j 的访问标志置为 1
visited[p->adjvex]=1;
//将顶点 j 入队列
q.push(p->adjvex);
}
p = p->nextarc; //p 移向下一个边结点
} //end of while
}
/********** End **********/
}