您的位置:首页 > 理论基础 > 数据结构算法

【深度优先搜索(DFS)算法】数据结构之图的深度优先搜索算法DFS初试

2013-10-09 18:07 483 查看
一切尽在代码中:

其中:本程序的图结构如下:



代码如下:

/***** 图的深度优先遍历DFS ********/

/******** written by C_Shit_Hu ************/

////////////////数据结构图的基本算法///////////////

/****************************************************************************/
/*
深度优先搜索的基本思想:递归。
从图的某个确定的顶点 V 出发,访问该顶点 V,然后再依次从 V 的未被访问过的邻接点出发,
继续深度优先遍历, 知道图中与顶点 V 路径相通的邻接点所有顶点都被访问过为止。
由于图不一定是连通的, 因此一次深度优先遍历不一定可以把图中所有的顶点遍历。
若此时有未被访问过的顶点, 就选择图中那个的一个没有被访问过的顶点作为起点,继续深度优先搜索,
重复上述操作,知道所有的顶点都被访问过。
*/
/****************************************************************************/

// 本代码图的存储方式采用邻接链表的方式

#include <stdio.h>
#include <stdlib.h>

// 邻接链表的单链表中的结点的数据结构体类型
typedef struct ArcNode{
int  adjvex;                   // 该边指向的顶点在顺序表中的位置
struct ArcNode  *next;         // 下一条边
}ArcNode;

// 邻接表中的顶点数据结构体类型
typedef struct VNode{
int  data;                     // 顶点中的数据信息
ArcNode  *firstarc;            // 指向单链表,即指向第一条边
}VNode;

// 定义访问状态表,并初始化为0
int visited[5]={0,0,0,0,0};

// 创建图结构的函数
void CreatGraph(int n , VNode G[] ){
int i,e;
ArcNode *p , *q;
printf("Input the information of the vertex\n");
for(i=0;i<n;i++){
scanf("%d",&G[i]);                           // 输入图的顶点元素信息并存储在一维数组中
G[i].firstarc = NULL;                        // 初始化第一条边为空
}

for(i=0;i<n;i++){
printf("Creat the edges for the %dth vertex\n",i) ;    // 依次创建图的顶点的邻接边顶点信息
scanf("%d",&e);                                        // 输入边信息
while(e!=-1){                                          // 以-1作为输入结束
p = (ArcNode *)malloc(sizeof(ArcNode));            // 创建一条边
p->next = NULL;
p->adjvex = e;
if(G[i].firstarc == NULL) G[i].firstarc = p; // 若i结点的第一条边为空,则将输入的值所附的顶点作为第一条边上在图中的位置
else q->next = p;                                 // 否则就是下一条边
q = p;
scanf("%d",&e);                                   // 输入边信息
}
}
}

// 邻接点查找函数
int  FirstAdj(VNode G[],int v){
if(G[v].firstarc != NULL)  return (G[v].firstarc)->adjvex;  // 如果第一个邻接点不为空, 返回该节点信息
return -1;
}

int  NextAdj(VNode G[],int v){
ArcNode *p;
p = G[v].firstarc;
while( p!= NULL){
if(visited[p->adjvex]) p = p->next;
else return p->adjvex;
}
return -1;
}

void DFS(VNode G[],int v){
int w;
printf("%d ",G[v]);     // 访问当前顶点,打印出该顶点中的数据信息
visited[v] = 1;         // 将顶点v对应的访问标记置1
w = FirstAdj(G,v);      // 找到顶点v的第一个邻接点,如果无邻接点,返回-1
while(w != -1){
if(visited[w] == 0)        // 该顶点未被访问
DFS(G,w);              // 递归地进行深度优先搜索
w = NextAdj(G,v);          // 找到顶点v的下一个邻接点,如果无邻接点,返回-1
}
}

int main()
{
VNode G[5];       // 创建一个 VNODE 结构体类型的数组
CreatGraph(5,G);  // 创建图
printf("开始深度优先搜索图.....\n");
printf("搜索结果如下:\n");
DFS(G,0);         // 深度优先搜索图
printf("\n");
getchar();
return 0 ;
}

/******************************************************/
/********************  心得体会  **********************/
/*
这个算是最基本的DFS算法,等学完图的搜索后研究一下更加高效的搜索方法。
*/
/******************************************************/


运行图片:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: