深度优先搜索遍历
图的深度优先搜索遍历类似于二叉树的先序遍历。它的基本思想是:首先访问出发点 v,并将其标记为已访问;然后选取与 v 邻接的未被访问的任意一个顶点 w,并访问它;再选取与 w 邻接的未被访问的任一顶点并访问,以此重复进行。
实现
int visit[maxSize]; //全局变量,用于存储结点是否被访问
void DFS(AGraph *G,int v) //参数:图G和访问点的编号v
{
ArcNode *p;
visit[v]=1; // 设置为已访问
Visit(v); // 对结点进行访问
p=G->adjlist[v].firstarc; // 指向结点v对应的第一条边
while(p!=NULL)
{
if(visit[p->adjvex]==0) // 若结点未访问,则递归访问
{
DFS(G,p->adjvex); // 递归,p->adjvex 边所指向的结点的位置
}
p=p->nextarc; // p的下一条边
}
}
广度优先搜索遍历
图的广度优先搜索遍历类似于树的层次遍历。它的基本思想是:首先访问出发点 v ,然后选取与 v 邻接的全部顶点 w1,…,wn 进行访问,再依次访问与 w1,…,wn 邻接的全部顶点(已经访问过的除外),以此类推,直到所有顶点都被访问过为止
实现
int visit[maxSize]; //全局变量,用于存储结点是否被访问
void BFS(AGraph *G,int v)
{
visit[v]=1;
Visit(v);
int que[maxSize]; // 创建队列
int front=0;
int rear=0;
rear=(rear+1)%maxSize; // 结点入队
que[rear]=v;
int j;
ArcNode *P;
while(front!=rear) // 队空时则遍历完成
{
front=(front+1)%maxSize; // 结点出队
j=que[front];
p=AGraph->adjlist[j].firstarc // 结点j的单链表对应的第一条边
while(p!=NULL)
{
if(visit[p->adjvex]==0)
{
visit[p->adjvex]=1;
Visit(p->adjvex);
rear=(rear+1)%maxSize; // 结点入队
que[rear]=p->adjvex;
}
p=p->nextarc;
}
}
}