图的遍历方式有两种:
1.深度优先搜索(DGS),类似于树的前序遍历。
2.广度优先搜索(BFS),类似于树的层次遍历。
具体代码如下:
1.DFS:
void Visit(Vertex n)
{
printf("%d ", n);
}
/* DFS递归调用,类似树的前序遍历 */
void DFS(MGraph graph, Vertex n, void (*Visit)(Vertex))
{
Vertex i;
printf("%d ", n);
visited[n] = true;
for(i = 0; i < graph->Nv; i++) {
if(graph->matrix[n][i] != 0) {
if(!visited[i]) {
DFS(graph, i, Visit);
}
}
}
}
/* 深度优先搜索 */
Status DFS_Traverse(MGraph graph)
{
int i;
for(i = 0; i < MaxVertexSize; i++)
visited[i] = false;
if(!graph)
return ERROR;
for(i = 0; i < graph->Nv; i++) {
if(!visited[i]) {
DFS(graph, i, Visit);
}
}
return OK;
}
2.BFS
void Visit(Vertex n)
{
printf("%d ", n);
}
/* 广度优先搜索 */
Status BFS_Traverse(MGraph graph)
{
int i, j, temp;
SeqQue *queue = InitQueue(MAXSIZE);
if(!graph)
return ERROR;
for(i = 0; i < MaxVertexSize; i++)
visited[i] = false;
for(i = 0; i < graph->Nv; i++) {
if(!visited[i]) {
EnQueue(queue, i);
visited[i] = true;
while(!QueueEmpty(queue)) {
DeQueue(queue, &temp);
Visit(temp);
for(j = 0; j < graph->Nv; j++) {
if(graph->matrix[temp][j] != 0 && !visited[j]) {
EnQueue(queue, j);
visited[j] = true;
}
}
}
}
}
}