图的遍历的定义
从图的某一个顶点出发,访问图中其余全部顶点,且使每一个顶点仅被访问一次,这就是图的遍历。
深度优先遍历
邻接矩阵存储方式的深度优先遍历
1 先对访问过程中标记用的数组进行初始化操作
2 通过循环访问标记用的数组,判断顶点是否被访问
3 没被访问进行递归调用
代码如下:
typedef int Boolean;
Boolean visited[maxvex];
void DFS(GRPH G, int i)
{
int j;
visited[i] = TURE;
printf("%c",G.vexs[i]);
for(j=0; j < G.numvertexes; j++)
{
if((G.edges[i][j] != 0) && (visited[j] == FALSE))
DFS(G,j);
}
}
void DFS_Operration(GRPH G)
{
int i;
for(i = 0; i < G.numvertexes; i++)
visited[i] = FALSE;
for(i = 0; i < G.numvertexes; i++)
{
if(visited[i] == FALSE)
DFS(G,i);
}
}
邻接表存储方式的深度优先遍历
1 先对访问过程中标记用的数组进行初始化操作
2 通过循环访问标记用的数组,判断顶点是否被访问
3 没被访问进行递归调用
4 递归函数首先需要将对应顶点标记用的数组元素置1
5 若是邻接表不为0,且顶点未被访问,则递归调用
代码如下
void AJDFS(GraphVerter *G, int i)
{
EdgeNode *p;
visited[i] = TURE;
printf("%c",G->verter[i]->data);
p = G->verter[i]->firstedge;
while(p)
{
if((p->adjvex != 0) && (visited[p->adjvex]))
AJDFS(G, p->adjvex);
p = p->next;
}
}
void AJDFS_Operration(GraphVerter *G)
{
int i;
for(i = 0; i < G->numvertexes; i++)
visited[i] = FALSE;
for(i = 0; i < G->numvertexes; i++)
{
if(visited[i] == FALSE)
AJDFS(G,i);
}
}
广度优先遍历
邻接矩阵存储方式的广度优先遍历
1 先对访问过程中标记用的数组进行初始化操作
2 初始化辅助用的队列
3 通过循环判断访问过程中标记用的数组的元素是否为0,进行遍历循环
4 若未被访问过则进行相应操作:输出顶点,顶点序号入队,标记数组置1
5 在大循环下,接下来通过循环,把A的关联顶点入队,并打印。
代码如下:
void BSF_Operation(GRPH G)
{
int i,j;
Queue Q;
for(i = 0; i < G.numvertexes; i++)
visited[i] = FALSE;
InitQueue(&Q);
for(i = 0; i < G.numvertexes; i++)
{
if(visited[i] == FALSE)
{
visited[i] = TURE;
printf("%c",G.vexs[i]);
EnQueue(&Q,&i);
while((!QueneEmpty(Q)))
{
DeQuene(&Q,&i);
for(j = 0; j < G.numvertexes; j++)
{
if((G.edges[i][j] == 1) && (!visited[i]))
{
EnQueue(&Q,&j);
printf("%c",G.vexs[j]);
visited[j] = TURE;
}
}
}
}
}
}