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

一切尽在代码中:


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


代码如下:


/***** 图的深度优先遍历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算法,等学完图的搜索后研究一下更加高效的搜索方法。
*/
/******************************************************/

运行图片:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值