(该图出自《大话数据结构》)
那么对于邻接矩阵的遍历,我们也可以选择深度优先搜索
首先我们再来理解一下深度优先搜索:即为一个递归的一个过程,对于图来说,就是从一个顶点出发,先访问该顶点,然后从该顶点还未被访问的邻接点出发,进行同样的操作,直到访问所有的顶点(我们在这里称之为停止条件)
还是同样的思路,先解决递归函数
void DFS (MGraph G,int i)
{
int j;
visited[i]=1;
printf("%d\n",G.vexs[i]);
for(j=0;j<G.numEdges ;j++)
if(G.arc[i][j]!=INFINITY&&!visited[j]) //寻找有效边,以及未遍历的顶点
DFS(G,j);
}
再来解决对图的整的递归调用
void DFSTraverse(MGraph G)
{
int i;
for(i=0;i<G.numVertexes ;i++)
if(!visited[i])
DFS(G,i);
}
好的,现在附上完整的代码,包括邻接矩阵的建立以及遍历
#include<stdio.h>
#include<stdlib.h>
//建立无向图邻接矩阵
#define MAX 50 //最大顶点数
#define INFINITY 666666 //表示不存在
typedef int VertexType; //顶点数据类型
typedef int EdgeType; //边上权值类型
int visited[MAX]={0};
typedef struct
{
VertexType vexs[MAX];
EdgeType arc[MAX][MAX];
int numVertexes,numEdges; //顶点数目以及边数
}MGraph;
//建立图
void Create(MGraph * G)
{
int i,j,k,w;
printf("输入顶点数以及边数\n");
scanf("%d%d",&G->numVertexes,&G->numEdges);
for(i=0;i<G->numVertexes;i++)
{
printf("请输入数据\n");
scanf("%d",&G->vexs[i]);
}
for(i=0;i<G->numEdges;i++)
{
for(j=0;j<G->numEdges;j++)
G->arc[i][j]=INFINITY;
}
for(k=0;k<G->numEdges;k++)
{
printf("请输入(vi,vj)的上下标,以及权值\n");
scanf("%d%d%d",&i,&j,&w);
G->arc[i][j]=w;
G->arc[j][i]=w;
}
return ;
}
//用深度优先搜索来遍历(depth-search-first)
void DFS (MGraph G,int i)
{
int j;
visited[i]=1;
printf("%d\n",G.vexs[i]);
for(j=0;j<G.numEdges ;j++)
if(G.arc[i][j]!=INFINITY&&!visited[j]) //寻找有效边,以及未遍历的顶点
DFS(G,j);
}
void DFSTraverse(MGraph G)
{
int i;
for(i=0;i<G.numVertexes ;i++)
if(!visited[i])
DFS(G,i);
}
int main()
{
MGraph G;
Create(&G);
DFSTraverse(G);
return 0;
}
好了,又到了总结的时间,对于邻接矩阵和邻接表的遍历,总体的思路差不多,就是有一个基本的递归函数,以及对递归函数进行判断性的调用(判断性可以理解为,只用遍历为遍历的顶点),弄清这些就可以啦。