![](https://img-blog.csdnimg.cn/img_convert/019e4f02d6d8ed14e9aa3f8ef1e68bd5.png)
上图是一个无向图的邻接表结构
对于邻接表的深度搜索遍历,总结以下要点:
弄清楚我们只需一个不差地将所有地顶点遍历一遍即可,无需进行一个顶点地多次遍历(不同于走迷宫)
弄清楚开始对顶点的总的一个遍历,在判断顶点未遍历时,进而按照边表所存储的边进行遍历
顶点的总的遍历
void DFSTraverse (Graph G)
{
for(int i=0;i<G.numvertexes ;i++)
{
if(!visited[i])
DFS(G,i);
}
}
按照边表继续遍历
void DFS(Graph G,int i)
{
EdgeNode *p;
visited[i]=1; //每次标记
printf("%d\n",G.adjlist[i].data );
p=G.adjlist[i].firstedge ;
while(p) //判断是否非空
{
if(!visited[p->adjvex ]) //判断是否遍历
DFS(G,p->adjvex );
p=p->next ; 继续遍历
}
}
每次遍历前将标记该顶点已遍历(这里用visited[i]=1表示遍历,=0代表未遍历)
总的代码如下(附上建立邻接表的代码)
#include<stdio.h>
#include<stdlib.h>
#define MAX 50 //表示最大顶点数
int visited[MAX]={0}; //初始化
typedef int VertexType; //顶点数据的类型
typedef int EdgeType; //边表权值的类型
//定义边表结点
typedef struct EdgeNode
{
int adjvex;
EdgeType weight;
struct EdgeNode *next;
}EdgeNode;
//定义顶点结点
typedef struct VertexNode
{
VertexType data;
EdgeNode *firstedge;
}VertexNode,AdjList[MAX];
typedef struct
{
AdjList adjlist;
int numEdges,numvertexes;
}Graph;
//对应无向图的邻接表
void Create(Graph *G)
{
int i,j,k,w;
EdgeNode *e;
printf("请输入图的顶点数,边数\n");
scanf("%d%d",&G->numvertexes ,&G->numEdges );
for(i=0;i<G->numvertexes ;i++)
{
printf("请输入第%d个数据\n",i+1);
scanf("%d",&G->adjlist[i].data );
G->adjlist[i].firstedge =NULL;
}
for(k=0;k<G->numEdges ;k++)
{
printf("请输入(vi,vj)中的i和j以及该边的权值\n");
scanf("%d%d%d",&i,&j,&w);
e=(EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex =i;
e->weight =w;
e->next =G->adjlist[j].firstedge ;
G->adjlist[j].firstedge =e;
e=(EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex =j;
e->weight =w;
e->next =G->adjlist[i].firstedge ;
G->adjlist[i].firstedge =e;
}
return ;
}
void DFS(Graph G,int i)
{
EdgeNode *p;
visited[i]=1; //每次标记
printf("%d\n",G.adjlist[i].data );
p=G.adjlist[i].firstedge ;
while(p) //判断是否非空
{
if(!visited[p->adjvex ]) //判断是否遍历
DFS(G,p->adjvex );
p=p->next ; 继续遍历
}
}
void DFSTraverse (Graph G)
{
for(int i=0;i<G.numvertexes ;i++)
{
if(!visited[i])
DFS(G,i);
}
}
int main()
{
Graph G;
Create(&G);
DFSTraverse(G);
return 0;
}
总的来说,深度搜索法无定法,因时因势,随机应变,确定遍历怎么走,走时有什么限制条件,是否走完,这样就可以啦。