紧接着上一篇,我们这次来探讨一下采用邻接表来存储的图的深度优先搜索遍历。
遍历方法还是与上一篇介绍的一样。
示例如下:
对此图进行遍历,图二是图一的对应顶点的字母,位置是一样的。
图一:
图二:
图三:
#include<stdio.h>
#define maxvertex 20
typedef struct ArcNode{
int adjvex; //顶点对应的下标
struct ArcNode *nextarc;
}ArcNode;
typedef struct VerNode{
char data;
ArcNode *firstarc;
}adjList[maxvertex];
typedef struct{
adjList v;
int vertex; //顶点数
int arc; //边数
int visit[maxvertex]; //记录每个顶点是否被访问,0表示未被访问,1表示已被访问
}Graph;
void DFS_AL(int x,Graph *G)
{
printf("%c\n",G->v[x].data);
G->visit[x]=1;
ArcNode *p;
p=G->v[x].firstarc;
while(p)
{
if(G->visit[p->adjvex]==0)
DFS_AL(p->adjvex,G);
p=p->nextarc;
}
}
int main()
{
Graph G;
int v1,v2; //v1为边的开始顶点,v2为边的指向顶点
printf("请输入顶点数和边数:");
scanf("%d %d",&G.vertex,&G.arc);
getchar();
//初始化表头结点
for(int i=0;i<G.vertex;i++)
{
printf("请输入%d号顶点",i);
scanf("%c",&G.v[i].data);
getchar();
G.v[i].firstarc=NULL;
G.visit[i]=0;
}
//生成邻接表
for(int j=0;j<G.arc;j++)
{
printf("请输入边的序号(序号从0开始):");
scanf("%d %d",&v1,&v2);
ArcNode *p1,*q1;//生成边结点
p1=(ArcNode *)malloc(sizeof(ArcNode));
p1->adjvex=v2;
p1->nextarc=NULL;
if(!G.v[v1].firstarc)
G.v[v1].firstarc=p1;
else
{
q1=G.v[v1].firstarc;
while(q1){
if(!q1->nextarc)
{
q1->nextarc=p1;
break;
}
q1=q1->nextarc;
}
}
ArcNode *p2,*q2;//生成边结点
p2=(ArcNode *)malloc(sizeof(ArcNode));
q2=(ArcNode *)malloc(sizeof(ArcNode));
p2->adjvex=v1;
p2->nextarc=NULL;
if(!G.v[v2].firstarc)
G.v[v2].firstarc=p2;
else
{
q2=G.v[v2].firstarc;
while(q2){
q2=q2->nextarc;
}
q2=p2;
}
}
int x;
printf("请输入开始顶点的编号:");
scanf("%d",&x);
DFS_AL(x,&G);
}
运行结果如下: