1 顶点A的未访邻接点有B、D、E,首先访问A的第一个未访邻接点B;
2 顶点B的未访邻接点有C、D,首先访问B的第一个未访邻接点C;
3 顶点C的未访邻接点只有F,访问F;
4 顶点F没有未访邻接点,回溯到C;
5 顶点C已没有未访邻接点,回溯到B;
6 顶点B的未访邻接点只剩下D,访问D;
7 顶点D的未访邻接点只剩下G,访问G;
8 顶点G的未访邻接点有E、H,首先访问G的第一个未访邻接点E;
9 顶点E没有未访邻接点,回溯到G;
10 顶点G的未访邻接点只剩下H,访问H;
11 顶点H的未访邻接点只有I,访问I;
12 顶点I没有未访邻接点,回溯到H;
13 B顶点H已没有未访邻接点,回溯到G;
14 顶点G已没有未访邻接点,回溯到D;
15 顶点D已没有未访邻接点,回溯到B;
16 顶点B已没有未访邻接点,回溯到A。
#include<stdio.h>
#include<stdlib.h>
#define True 1
#define False 0
#define MAX 20 //顶点个数
int visited[MAX];
/*图的种类:DG表示有向图,DN表示有向网,UDG表示无向图,UDN表示无向网*/
//邻接矩阵图,深度优先遍历
typedef enum{DG,DN,UDG,UDN} GraphKind;
typedef enum{DQ,WQ} AdjType;
typedef struct{ //定义弧
int info; //权值
}ArcNode;
typedef struct{ //定义图
char vertex[MAX]; //图的顶点
ArcNode arcs[MAX][MAX]; //邻接矩阵
int vexnum,arcnum; //图的顶点数和弧数
GraphKind kind; //图的类型
}AdjMatrix;
int GreateDN(AdjMatrix *G) //建立图
{
int i,j,k,weight; //i用于一维数组和矩阵,j用于矩阵,k:第几条弧
char v1,v2; //图的顶点
printf("输入图的顶点数和弧数:");
scanf("%d,%d",&(G->vexnum),&(G->arcnum));
printf("输入图的顶点:(A,B,C...)");
for(i=0;i<G->vexnum;i++)
{
getchar();
scanf("%c",&(G->vertex[i]));
}
for(i=0;i<G->vexnum;i++) //初始化邻接矩阵
for(j=0;j<G->vexnum;j++)
G->arcs[i][j].info=0;
for(k=0;k<G->arcnum;k++)
{
getchar();
printf("请输入第%d条弧的两个顶点名称:",k+1);
scanf("%c,%c",&v1,&v2);
for(i=0;v1!=G->vertex[i];i++)
for(j=0;v2!=G->vertex[j];j++);
G->arcs[j][i].info=1;
G->arcs[i][j].info=1;
}
}
void Depthsearch(AdjMatrix *G) //深度优先遍历搜索
{
int i;
for(i=0;i<G->vexnum;i++) //初始化所有顶点为False,未访问
visited[i]=False;
for(i=0;i<G->vexnum;i++)
if(!visited[i])
Depth(G,i);
}
void Depth(AdjMatrix *G,int i) //深度优先遍历
{
int j;
printf("%c ",G->vertex[i]); //访问vi顶点
visited[i]=True;
for(j=0;j<G->vexnum;j++) //依次搜索vi邻接点
if(G->arcs[i][j].info==1 && !visited[j])
Depth(G,j);
}
int main()
{
AdjMatrix G; //G的邻接矩阵表示法
GreateDN(&G); //创建G的邻接矩阵
printf("邻接矩阵的深度优先遍历输出结果:");
Depthsearch(&G);
printf("\n");
printf("邻接矩阵的广度优先遍历输出结果:");
Breadthsearch(&G);
return 0;
}