Linux深度优先搜索文件,嵌入式linux c 学习笔记4-深度优先搜索和广义优先搜索

/*

* =====================================================================================

*

*       Filename:  dfs.c

*

*    Description:  dfs 深度优先搜索,bfs 广义优先搜索

*

*        Version:  1.0

*        Created:  2010年10月27日 22时08分27秒

*       Revision:  none

*       Compiler:  gcc

*

*         Author:  Yang Shao Kun (), cdutyangshaokun@163.com

*        Company:  College of Information Engineering of CDUT

*

* =====================================================================================

*/

深度优先搜索:重图的概念引发出来的。

我们从图中的某一个起始点v开始,访问他的任何一个邻接点w,然后

在从w出发,访问w的邻接点(没有访问过的)w2,然后在从w2开始,进

行类似的访问,直到所用的邻接点都被访问后为止。接着,退回一步,

退到前一次刚被访问的节点,看,它还有没有没有被访问的邻接点。重

复以上步骤,直到所有的顶点都被访问后结束。

算法实现:

void dfs(algraph *g,int v)

{

arcnode *p;

visited[v]=1;/*置已经访问标记*/

printf("%d ",v);/* 输出被访问的节点编号*/

p=g->adjlist[v].firstarc;/*p指向顶点v的第一条连线的结点*/

while(p!=NULL)

{

if(visted[p->adjvex]==0)/*若节点p->adjvex没有访问,递归访问它*/

dfs(g,p->adjvex);

p=p->nextarc;

}

}

用到的数据结构有:

typedef struct {

Adjlist adjlist;/*邻接表*/

int n,e;/*图中顶点数和边数*/

}algraph;/*图的类型*/

typedef struct Vnode{

int data;/*int可以更换*/

arcnode *firstarc;/*指向第一条弧*/

}vnode;

typedef vnode adjlist[max];/*adjlist 是邻接表型*/

typedef struct anode{

int adjvex;/*该弧点的终点位置*/

struct anode *nextarc;/*指向下一条弧的指针*/

}arcnode

回溯:在探索问题的时候走进了死胡同,则需要退回来,重例外的一条路开始。

广度优先搜索:首先访问初始点v1,接着访问v1的所有未访问过的领结点,v2,v3,,,,vt,然后在按照v1,,,vt的次序,访问每一个顶点的所有未被访问的邻接点,直到所有的顶点都被访问后结束。

所以,这个数据结构类似于------队列。

void bfs(algraph *g,int v)

{

arcnode *p;

int queue[max],front=0,rear=0;/*定义循环队列并初始化*/

int visited[max];/*定义存放结点的访问标志的数组*/

int w,i;

for(i=0;in;i++)

visited[i]=0;/*访问标志数组初始化*/

printf("%d",v);

visited[v]=1;

rear=(rear+1)%max;

queue[rear]=v;/*v进队*/

while(front!=rear)

{

front=(front+1)%max;

w=queue[front];

p=g->adjlist[w].firstarc;/*找与顶点w邻接的第一个顶点*/

while(p!=NULL)

{

if(visted[p->adjvex]==0)/*如果当前的节点没有被访问*/

{

printf("%d",p->adjvex);/*访问当前的节点*/

visited[p->adjvex]=1;/*置该顶点已被访问标志*/

rear=(rear+1)%max;/*该顶点进队*/

queue[rear]=p->adjvex;

}

p=p->nextarc;/*找下一个邻接顶点*/

}

}

printf("/n");

}

广度优先搜索能找到最短的路径。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值