当前位置: 首页 > news >正文

数据结构-邻接表广度优先搜索(C语言版)

对于一个有向图无向图,我们下面介绍第二种遍历方式。

广度优先搜索,即优先对同一层的顶点进行遍历。

如下图所示:

该例子,我们有六个顶点, 十条边。

对于广度优先搜索,我们先搜索a,再搜索abcd,最后搜索ef。

而对于广度优先搜索,我们需要一个队列来辅助我们进行广度优先搜索(先进先出)。

同时我们还需要一个visit数组来判断某个顶点是否已经被搜索过了。

#include<stdio.h>

#define MAX_NUM 100
typedef struct ArcNode{				//边 
	int adjvex;
	struct ArcNode *next;
	int weight;
}ArcNode;		

typedef struct{						//头结点 
	char vertex;
	ArcNode *firstarc;
}VNode;

typedef VNode Adjlist[MAX_NUM];			//邻接表 

typedef struct{			//建立邻接表 
	Adjlist adjlist;
	int vexnum,arcnum;
}ALGraph;

void DFSTraverse(ALGraph *G)		//深度优先搜索 
{
	int v;
	int visit[G->vexnum];
	for(v=0;v<G->vexnum;v++){
		visit[v] = 0;
	}
	for(v=0;v<G->vexnum;v++){
		if(visit[v]==0)
			DFS(G,v,visit);
	}
}

void DFS(ALGraph *G,int v,int *visit)		//深度优先搜索后继结点判断 
{
	int w;
	ArcNode *p;
	printf("访问顶点:%c\n",G->adjlist[v].vertex);
	visit[v] = 1;
	p = G->adjlist[v].firstarc;
	while(p){
		w = p->adjvex;
		if(visit[w]==0)
			DFS(G,w,visit);
		p = p->next;
	}
}

void BFSTraverse(ALGraph *G)		//广度优先搜索后继节点判断 
{
	int v,w,u;
	int Q[G->vexnum+1],r,f;
	int visit[G->vexnum];
	for(v=0;v<G->vexnum;v++)
		visit[v] = 0;
	f = 0,r = 0;
	for(v=0;v<G->vexnum;v++){
		if(visit[v]==0){
			visit[v] = 1;
			printf("第%d个结点是->%c\n",v,G->adjlist[v].vertex);
			Q[r] = v;
			r = (r+1)%(G->vexnum+1);
			while(f!=r){
				u = Q[f];
				f = (f+1)%(G->vexnum+1);
				ArcNode *p = G->adjlist[u].firstarc;
				while(p){
					if(visit[p->adjvex]==0){
						visit[p->adjvex] = 1;
						printf("第%d个结点是->%c\n",p->adjvex,G->adjlist[p->adjvex].vertex);
						Q[r] = p->adjvex;
						r = (r+1)%(G->vexnum+1);
					}
					p = p->next;
				}
			}
		}
	}
}

int main()
{
	return 0;
}

运行结果如下:

相关文章:

  • 机器学习中的关键组件
  • OpenCV官方教程中文版 —— 图像修复
  • 利用MySQL玩转数据分析之基础篇
  • Proteus仿真--12864LCD显示计算器键盘按键实验(仿真文件+程序)
  • 学习小结,学而时习之,坚持学习之,温顾学习之
  • Webpack的Tree Shaking。它的作用是什么?
  • Docker Stack部署应用详解+Tomcat项目部署详细实战
  • Linux ----------------------- 文本处理工具
  • C语言 || volatile
  • 云安全-云原生k8s攻击点(8080,6443,10250未授权攻击点)
  • 【SpringBoot笔记42】SpringBoot集成knife4j生成接口文档
  • 【3D图像分割】基于Pytorch的VNet 3D图像分割5(改写数据流篇)
  • 【RabbitMQ】RabbitMQ 消息的堆积问题 —— 使用惰性队列解决消息的堆积问题
  • List 接口常用实现类底层分析
  • 『CV学习笔记』图像超分辨率等图像处理任务中的评价指标PSNR(峰值信噪比)
  • Modbus java代码实例
  • 小程序如何设置用户同意服务协议并上传头像和昵称
  • Ubuntu 增加服务 比如openfire
  • elasticsearch索引按日期拆分
  • 聊天室的创建
  • 海南征集民生领域涉嫌垄断违法行为线索,包括行业协会等领域
  • 复旦建校120周年|迎来复旦大学艺术馆开馆
  • 王毅同丹麦外交大臣会谈,表示在格陵兰问题充分尊重丹麦主权和领土完整
  • 研究显示:肺活量衰减始于20至25岁
  • 复旦大学艺术馆开馆:以当代视角再看文科文脉
  • 一女游客在稻城亚丁景区因高反去世,急救两个多小时未能恢复生命体征