对于一个有向图无向图,我们下面介绍第二种遍历方式。
广度优先搜索,即优先对同一层的顶点进行遍历。
如下图所示:
该例子,我们有六个顶点, 十条边。
对于广度优先搜索,我们先搜索a,再搜索abcd,最后搜索ef。
而对于广度优先搜索,我们需要一个队列来辅助我们进行广度优先搜索(先进先出)。
同时我们还需要一个visit数组来判断某个顶点是否已经被搜索过了。
#include<stdio.h>#define MAX_NUM 100
typedef struct ArcNode{ //边 int adjvex;struct ArcNode *next;int weight;
}ArcNode; typedef struct{ //头结点 char vertex;ArcNode *firstarc;
}VNode;typedef VNode Adjlist[MAX_NUM]; //邻接表 typedef struct{ //建立邻接表 Adjlist adjlist;int vexnum,arcnum;
}ALGraph;void DFSTraverse(ALGraph *G) //深度优先搜索
{int v;int visit[G->vexnum];for(v=0;v<G->vexnum;v++){visit[v] = 0;}for(v=0;v<G->vexnum;v++){if(visit[v]==0)DFS(G,v,visit);}
}void DFS(ALGraph *G,int v,int *visit) //深度优先搜索后继结点判断
{int w;ArcNode *p;printf("访问顶点:%c\n",G->adjlist[v].vertex);visit[v] = 1;p = G->adjlist[v].firstarc;while(p){w = p->adjvex;if(visit[w]==0)DFS(G,w,visit);p = p->next;}
}void BFSTraverse(ALGraph *G) //广度优先搜索后继节点判断
{int v,w,u;int Q[G->vexnum+1],r,f;int visit[G->vexnum];for(v=0;v<G->vexnum;v++)visit[v] = 0;f = 0,r = 0;for(v=0;v<G->vexnum;v++){if(visit[v]==0){visit[v] = 1;printf("第%d个结点是->%c\n",v,G->adjlist[v].vertex);Q[r] = v;r = (r+1)%(G->vexnum+1);while(f!=r){u = Q[f];f = (f+1)%(G->vexnum+1);ArcNode *p = G->adjlist[u].firstarc;while(p){if(visit[p->adjvex]==0){visit[p->adjvex] = 1;printf("第%d个结点是->%c\n",p->adjvex,G->adjlist[p->adjvex].vertex);Q[r] = p->adjvex;r = (r+1)%(G->vexnum+1);}p = p->next;}}}}
}int main()
{return 0;
}
运行结果如下: