图的深度优先搜索遍历DFS和广度优先搜索遍历BFS——C/C++
#define MAXSIZE 8
//邻接表结构
typedef struct ArcNode{
int adjvex; //该边所指向的结点编号
struct ArcNode *nextarc; //指向下一条边的指针
int info; //该边的相关信息,权值等
}ArcNode;
typedef struct{
char data; //顶点的相关信息
ArcNode *firstarc; //指向第一条边的指针
}VNode;
typedef struct{
VNode adjlist[MAXSIZE]; //顶点
int n,e; //顶点数和边数
}AGraph;
//对顶点v的操作函数
void Visit(int v)
{
cout<<" "<<v;
}
//深度优先搜索遍历DFS deepth first search
int visit[MAXSIZE]; //全局标记数组
void DFS(AGraph *G,int v) //v为起点
{
/*int i;
for(i=0;i<G->n;i++)
visit[i] = 0; //初始化为0代表顶点未被访问
*/
ArcNode *p;
visit[v] = 1;
Visit(v);
p = G->adjlist[v].firstarc; //p指向顶点v的第一条边
while(p!=NULL){
if(visit[p->adjvex]==0) //若顶点未被访问,则递归访问它
DFS(G,p->adjvex);
p = p->nextarc; //p指向v的下一条边
}
}
//非连通图的深度优先遍历
void dfs(AGraph *G)
{
int i;
for(i=0;i<G->n;i++) //初始化为0代表顶点未被访问
visit[i] = 0;
for(i=0;i<G->n;i++)
if(visit[i]==0)
DFS(G,i);
}
//广度优先搜索遍历BFS broad first search
void BFS(AGraph *G,int v)
{
int i;
/*for(i=0;i<G->n;i++)
visit[i] = 0; //初始化为0代表顶点未被访问
*/
ArcNode *p;
int que[MAXSIZE],front = 0,rear = 0; //循环队列
Visit(v);
visit[v] = 1;
rear = (rear+1)%MAXSIZE; //当前顶点入队
que[rear] = v;
while(front!=rear){ //队空循环退出时代表遍历完成
front = (front+1)%MAXSIZE; //顶点出队
i = que[front];
p = G->adjlist[i].firstarc;
//将该顶点的所有邻接顶点入队
while(p!=NULL){
if(visit[p->adjvex]==0){
Visit(p->adjvex);
visit[p->adjvex] = 1;
rear = (rear+1)%MAXSIZE;
que[rear] = p->adjvex;
}
p = p->nextarc;
}
}
}
//非连通图的广度优先遍历
void bfs(AGraph *G)
{
int i;
for(i=0;i<G->n;i++) //初始化为0代表顶点未被访问
visit[i] = 0;
for(i=0;i<G->n;i++)
if(visit[i]==0)
BFS(G,i);
}