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

news2024/11/23 23:02:59

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

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

如下图所示:

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

对于广度优先搜索,我们先搜索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;
}

运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1171517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电路正负反馈,电压电流反馈,串并联反馈详细判别方法

正/负反馈&#xff1a;假设输出升高&#xff0c;转一圈回来仍使其升高就是正反馈&#xff0c;反之就是负反馈。作图法&#xff1a;在RL的信号端画一个向上的小箭头&#xff0c;沿着反馈环路&#xff0c;每经过一个元器件就画一个相应的箭头&#xff0c;一直画到放大器的输出端&…

基于java+springboot+vue的游戏道具管理系统

项目介绍 本论文主要论述了如何使用JAVA语言开发一个游戏道具管理系统 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述校园出入管理系统的当前背景以及系统开…

【云服务器】对比传统服务器,为什么说云服务器更具优势?

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️其他领域】 文章目录 前言云服务器云服务器的优势成本可扩展性可靠性和安全性 总结 前言 2006年搜索引擎大会上&#xff0c;“云服务器”的概念孕育而生&#xff0c;时至今日云服务器与传统服务器的…

基于java+springboot+vue在线选课系统

项目介绍 本系统结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xff0c;采用JAVA语言&#xff0c;结合SpringBoot框架与Vue框架以及MYSQL数据库设计并实现的。员工管理系统主要包括个人中心、课程管理、专业管理、院系信息管理、学生…

WorkManger学习汇总

一.使用 WorkManger主要是用来执行一定会执行的任务的&#xff0c;如即使app被杀掉、手机重启都会执行。 适用场景&#xff1a;定期重复性任务&#xff0c;如定期log上传等 使用的话首先引入库&#xff08;我使用的是2.7.1&#xff09; implementation "androidx.work:…

Technology strategy Pattern 学习笔记1-Context: Architecture and Strategy

Context: Architecture and Strategy 1 Architect and Strategist 1.1 three primary concerns of the architect 1.1.1 Contain entropy(熵-混乱程度&#xff0c;不确定性&#xff0c;惊奇程度&#xff0c;不可预测性&#xff0c;信息量等等&#xff09; The architect wh…

Kafka(二)消息系统设计

文章目录 前言整体设计时序图时序图解释 最后 前言 当多个系统之间通过Kafka来解耦时&#xff0c;在系统设计初期&#xff0c;基本的要求都是相似的&#xff0c;只不过是消费消息时的业务逻辑可能不同。 本文以业务系统和邮件系统解耦作为示例。业务系统需要发送邮件时&#…

【入门Flink】- 05Flink运行时架构以及一些核心概念

系统架构 Flink运行时架构Standalone会话模式为例 1&#xff09;作业管理器&#xff08;JobManager&#xff09; JobManager 是一个 Flink 集群中任务管理和调度的核心&#xff0c;是控制应用执行的主进程。每个应用都应该被唯一的 JobManager 所控制执行。 JobManger 又包含…

广告引擎检索技术快速学习

目录 一、广告系统与广告引擎介绍 &#xff08;一&#xff09;广告系统与广告粗分 &#xff08;二&#xff09;广告引擎在广告系统中的重要性分析 二、广告引擎整体架构和工作过程 &#xff08;一&#xff09;一般概述 &#xff08;二&#xff09;核心功能架构图 三、标…

数字IC后端实现 |TSMC 12nm 与TSMC 28nm Metal Stack的区别

下图为咱们社区IC后端训练营项目用到的Metal Stack。 芯片Tapeout Review CheckList 数字IC后端零基础入门Innovus学习教程 1P代表一层poly&#xff0c;10M代表有10层metal&#xff0c;M5x表示M2-M6为一倍最小线宽宽度的金属层&#xff0c;2y表示M7-M8为二倍最小线宽宽度的金…

C++笔记之lambda捕获列表中的‘this‘指针

C笔记之lambda捕获列表中的’this’指针 code review! 捕获this指针的lambda表达式在C中有多种应用场景。以下是一些示例&#xff1a; 异步编程&#xff1a;当您需要在异步操作中访问类的成员变量或成员函数时&#xff0c;可以使用捕获this指针的lambda表达式。例如&#xf…

【高性能网络协议栈】openonload 篇

Onload 是 Solarflare 公司开发的加速的网络中间件。它在用户空间实现了 TCP/IP 网络协议栈&#xff0c;能在用户空间直接访问&#xff08;安全的&#xff09;网络适配器硬件访问权限硬件。网络数据可以直接在网络和应用之间收发&#xff0c;而不必通过操作系统&#xff0c;这种…

【蓝桥杯选拔赛真题10】C++求奇数和 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++求奇数和 一、题目要求 1、编程实现 2、输入输出 二、算法分析 <

第10届集美大学校赛(F,H)

两个有些难度的dp 中文题面&#xff0c;题意略 F 时间超限 II 一开始的思路想复杂了&#xff0c;想成了多重集的组合数学&#xff0c;二进制枚举肯定不行&#xff0c;dp也想的很复杂还错估时间复杂度。 补题的时候被题解的方法折磨好久&#xff0c;太抽象了。 这是官方题解…

tbh着色

在tbh中&#xff0c;着色之前&#xff0c;首先可以可以创建多个色板&#xff0c;如果不同角色颜色不一样&#xff0c;就可以创建多个色板&#xff0c;每一个色板代表的角色不同。 1、创建色板 有两种方式&#xff1a; 方法一&#xff1a;在颜色菜单中&#xff0c;点击左上角 …

2023年【山东省安全员C证】考试内容及山东省安全员C证复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员C证考试内容是安全生产模拟考试一点通总题库中生成的一套山东省安全员C证复审考试&#xff0c;安全生产模拟考试一点通上山东省安全员C证作业手机同步练习。2023年【山东省安全员C证】考试内容及山东省安…

『精』Vue 组件如何模块化抽离Props

『精』Vue 组件如何模块化抽离Props 文章目录 『精』Vue 组件如何模块化抽离Props一、为什么要抽离Props二、选项式API方式抽离三、组合式API方式抽离3.1 TypeScript类型方式3.2 文件分离方式3.3 对文件分离方式优化 参考资料&#x1f498;推荐博文&#x1f357; 一、为什么要抽…

串口代码整合2-如何接收数据?

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

力扣刷题-二叉树-二叉树的非递归遍历

参考&#xff1a;https://www.programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%BF%AD%E4%BB%A3%E9%81%8D%E5%8E%86.html#%E6%80%9D%E8%B7%AF 思路 为什么可以用迭代法&#xff08;非递归的方式&#xff09;来实现二叉树的前后中序遍历呢&#xff1f; 我们在栈与…

ruo-yi项目部署 前后端分离

nginx服务器部署java服务器部署db服务器部署配置打包环境配置前端打包环境&#xff08;java服务器&#xff09;配置后端打包环境获取代码 前端代码打包后端代码打包项目上线前端项目上线后端项目上线 将jar包传送到后端服务器导入初始化数据 ip主机名服务名称192.168.20.138ngi…