图的深度优先搜索遍历(DFS)类似于二叉树的先序遍历
图的广度优先搜索遍历(DFS)类似于树的层次遍历
#include<stdio.h>
#include<iostream>
#define maxsize 20
using namespace std;
//表结点
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;
/*--------------------DFS-------------------*/
int visit[maxsize];
void DFS(AGraph *G,int v)
{
ArcNode* p;
for(int i=0;i<G->n;++i)
visit[i]=0;
visit[v] = 1;
p = G->adjlist[v].firstarc;
while (p != NULL)
{
if (visit[p->adjvex] == 0) //若顶点未访问,则递归访问它
DFS(G, p->adjvex);
p = p->nextarc; //p指向顶点v的下一条边的终点
}
}
/*--------------------BFS-------------------*/
void BFS(AGraph* G, int v, int visit[maxsize])
{
ArcNode* p;
int que[maxsize];
int front = 0, rear = 0;
int j;
for(int i=0;i<G->n;++i)
visit[i]=0;
visit[v] = 1;
rear = (rear + 1) % maxsize;
que[rear] = v; //当前结点入队
while (front != rear)
{
front = (front + 1) % maxsize;
j = que[front];
p = G->adjlist[j].firstarc; //p指向出队顶点j的第一条边
while (p != NULL) //层次遍历
{
if (visit[p->adjvex] == 0) //若没有访问,则访问
{
visit[p->adjvex] = 1;
rear = (rear + 1) % maxsize; //该顶点进队
que[rear] = p->adjvex;
}
p = p->nextarc; //p指向下一条边
}
}
}