数据结构广度优先搜索遍历(有向图和无向图均可)(C语言代码+邻接矩阵方式+连通图和非连通图均可)

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 100//最大顶点数
typedef struct
{
	int vexs[MAXVEX];//存储顶点的数组
	int matrix[MAXVEX][MAXVEX];//存储邻接矩阵的二维数组
	int vexnum, edgenum;//顶点数+边数
}MGraph;
int visited[MAXVEX];
//这里新增队列的代码
typedef struct QueueNode
{
	int data;
	struct QueueNode* next;
}QueueNode;
typedef struct
{
	QueueNode* front;//队头
	QueueNode* rear;//队尾
}Queue;
//初始化
void InitQueue(Queue* Q)
{
	Q->front = Q->rear = NULL;
}
//判空处理
int QueueEmpyt(Queue* Q)
{
	return Q->front == NULL;
}
//入队操作
void enQueue(Queue* Q, int e)
{
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	newnode->data = e;
	newnode->next = NULL;
	if (Q->rear == NULL)
	{
		Q->front = Q->rear = newnode;
	}
	else
	{
		Q->rear->next = newnode;
		Q->rear = newnode;
	}
}
//出队
int deQueue(Queue* Q)
{
	if (QueueEmpyt(Q))
	{
		printf("队空,无输出内容\n");
		exit(1);
	}
	QueueNode* temp = Q->front;
	int data = temp->data;//data保存temp的data,等下返回用,成为我们的新顶点去广度遍历它的邻接j
	Q->front = Q->front->next;
	if (Q->front == NULL)
	{
		Q->rear = NULL;//如果是最后一个数据,那么front和rear同时置为NULL
	}
	free(temp);
	return data;
}
void CreateMGraph(MGraph* G)
{
	int i, j, k;
	printf("请输入顶点数和边数\n");
	scanf("%d%d", &G->vexnum, &G->edgenum);
	printf("请输入顶点信息\n");
	//数组顶点信息(结点)
	for (i = 0; i < G->vexnum; i++)
	{
		scanf("%d", &G->vexs[i]);
	}
	//初始化邻接矩阵的二维数组
	for (i = 0; i < G->vexnum; i++)
	{
		for (j = 0; j < G->vexnum; j++)
		{
			G->matrix[i][j] = 0;
		}
	}
	printf("请输入边的信息\n");
	for (k = 0; k < G->edgenum; k++)
	{
		printf("请输入边(vi,vj)的下标i,下标j\n");
		scanf("%d%d", &i, &j);
		G->matrix[i][j] = 1;
		G->matrix[j][i] = 1;
	}
}
void BFS(MGraph* G,int v)
{
	Queue Q;
	InitQueue(&Q);
	visited[v] = 1;
	enQueue(&Q, v);
	while (!QueueEmpyt(&Q))
	{
		int currentVertex = deQueue(&Q);
		printf("%d ", currentVertex);
		for (int i = 0; i < G->vexnum; i++)
		{
			if (G->matrix[currentVertex][i] == 1 && visited[i] == 0)
			{
				visited[i] = 1;
				enQueue(&Q, i);
			}
		}
	}
}
void BFSTraverse(MGraph* G)
{
	int i;
	for (i = 0; i < G->vexnum; i++)
	{
		visited[i] = 0;
	}
	for (i = 0; i < G->vexnum; i++)
	{
		if (visited[i] == 0)
		{
			BFS(&G,i);
		}
	}
}
int main()
{
	MGraph G;
	CreateMGraph(&G);
	printf("广度优先搜索遍历如下\n");
	BFSTraverse(&G);
	return 0;
}

 上图代码是无向图的代码

无向图的连通图终端输入如下:

请输入顶点数和边数
8 7
请输入顶点信息
0 1 2 3 4 5 6 7
请输入边的信息
请输入边(vi,vj)的下标i,下标j
0 1
请输入边(vi,vj)的下标i,下标j
0 2
请输入边(vi,vj)的下标i,下标j
1 3
请输入边(vi,vj)的下标i,下标j
1 4
请输入边(vi,vj)的下标i,下标j
3 7
请输入边(vi,vj)的下标i,下标j
2 5
请输入边(vi,vj)的下标i,下标j
2 6
广度优先搜索遍历如下
0 1 2 3 4 5 6 7

图片如下: 

无向图的非连通图终端输入: 

请输入顶点数和边数
8 6
请输入顶点信息
0 1 2 3 4 5 6 7
请输入边的信息
请输入边(vi,vj)的下标i,下标j
0 1
请输入边(vi,vj)的下标i,下标j
1 3
请输入边(vi,vj)的下标i,下标j
1 4
请输入边(vi,vj)的下标i,下标j
3 7
请输入边(vi,vj)的下标i,下标j
2 5
请输入边(vi,vj)的下标i,下标j
2 6
广度优先搜索遍历如下
0 1 2 3 4 5 6 7

 

有向图的代码只需要修改如下:

	printf("请输入边的信息\n");
	for (k = 0; k < G->edgenum; k++)
	{
		printf("请输入边(vi,vj)的下标i,下标j\n");
		scanf("%d%d", &i, &j);
		G->matrix[i][j] = 1;
	}

因为有向图不是对称 对于邻接矩阵代码实现来说, 所以不需要G->marrix[j][i] = 1;

有向图的终端输入:

请输入顶点数和边数
4 3
请输入顶点信息
0 1 2 3
请输入边的信息
请输入边(vi,vj)的下标i,下标j
0 1
请输入边(vi,vj)的下标i,下标j
0 2
请输入边(vi,vj)的下标i,下标j
2 3
广度优先搜索遍历如下
0 1 2 3

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

医院信息化与智能化系统(3)

医院信息化与智能化系统(3) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应的…

Leetcode 最小路径和

这段代码解决的是LeetCode第64题“最小路径和”&#xff0c;其核心思想是动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;。以下是算法的具体解释&#xff1a; 1. 问题描述&#xff1a; 我们给定一个包含非负整数的 m x n 网格&#xff08;grid&…

智慧园区能带来哪些便利?

所谓智慧园区&#xff0c;是指通过信息化手段&#xff0c;实现园区内各项业务的数字化和智能化管理。园区管理者可以利用智能化平台实时监控各项运营情况&#xff0c;如能源使用、安全监控和物流运输等&#xff0c;及时调整管理策略&#xff0c;提高运营效率。智慧园区利用大数…

基于SSM+微信小程序的打印室预约管理系统(打印2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的打印室预约管理系统实现了管理员和用户两个角色。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;附近打印店管理&#xff0c;文件打印管理&#xff0c;当…

【配色网站分享】

个人比较喜欢收藏一些好看的插画、UI设计图和配色&#xff0c;于是有了此篇&#xff0c;推荐一些配色网站&#xff0c;希望能对自己和大家有些帮助。 1.uiGradients 一个主打渐变风网站&#xff0c;还可以直接复制颜色。 左上角的“show all gradients”可以查看一些预设的渐…

redis的发布订阅模式

1.发布订阅模式的结构 结合上图和消息中间件&#xff0c;可以将channel和消息中间件中的topic主题对应起来 2. Redis发布订阅功能 &#xff08;1&#xff09;发送消息 Redis采用PUBLISH命令发送消息&#xff0c;其返回值为接收到该消息的订阅者的数量。 &#xff08;2&#xf…

C++进阶——set和map

目录 前言 一、set 1.set的基本介绍 2.set的使用 2.1构造与迭代器 2.2插入 2.3删除 2.4查找 2.5获取需要的区间 2.6一些使用示例 3.set和multiset的区别 4.set相关oj题目 二、map 1.map的基本介绍 2.map的使用 2.1构造与迭代器 2.2增删查以及获取区间 2.3数据…

java基础:while循环-猜数字游戏(附源码)

知识点&#xff1a;while循环 参考该文&#xff1a;JAVA中while循环的使用 实践&#xff1a;猜数字游戏 通过while 判断是否正确&#xff0c; 猜中结束&#xff0c; 若猜不中&#xff0c;猜3次结束 package com.game;import java.util.Scanner;public class Game {public…

DNS安全概述

一、DNS的解析过程 1.递归解析 递归解析是一种由DNS客户端&#xff08;通常是用户的应用程序&#xff0c;如一个浏览器&#xff09;向本地DNS解析器发出解析请求&#xff0c;然后本地DNS解析器负责查询最终结果并将结果返回给客户端&#xff0c;而中间的所有查询请求都由本地D…

学习docker第四弹------docker将本地镜像发布到私有库

目录 1 是什么2 使用2.1 下载镜像2.2 运行私有库Registry&#xff0c;相当于本地有个私有Docker hub2.3 案例演示创建一个新镜像&#xff0c;ubuntu安装ifconfig命令2.3.1 从Hub上下载ubuntu镜像到本地并成功安装2.3.2 原始的ubuntu镜像是不带着ifconfig命令的2.3.3 外网连通的…

在线绘图工具drawio,visio的平替

Draw.io&#xff1a;灵活高效的在线绘图工具推荐 在工作和项目管理中&#xff0c;流程图、架构图和思维导图等可视化图表是非常重要的沟通工具。Draw.io&#xff08;现更名为diagrams.net&#xff09;是一个强大且免费的在线绘图工具&#xff0c;适用于创建各种类型的图表。它功…

ComfyUI一键更换服装:IP-Adapter V2 + FaceDetailer(DeepFashion)

在这篇文章中&#xff0c;我们将探索如何使用新版的IP-Adapter和ComfyUI软件为人物进行换装。 整个过程非常简单&#xff0c;仅需要两张图片&#xff1a;一张服装图片和一张人物图片。 通过一系列节点的操作&#xff0c;ComfyUI就会把这个服装换到人物身上&#xff0c;并利用…

施磊C++ | 进阶学习笔记 | 5.设计模式

五、设计模式 这里贴出常用的23中设计模式。视频课程仅包含部分&#xff0c;剩余部分需要找其他课程或者资料进行自学。 1.设计模式三大类型概述 C设计模式是一套被广泛认可的用于解决常见软件设计问题的最佳实践&#xff0c;它们可以帮助开发者编写更加清晰、可维护和可扩展…

小白投资理财 - 解读市净率

小白投资理财 - 解读市净率 什么是市净率公式 市净率的解释市净率的意义市净率的局限性市净率的应用场景市净率举例计算市净率如何解读分析可能的情景对比其他行业公司 市净率与其他估值指标的结合总结 什么是市净率 市净率&#xff08;Price-to-Book Ratio&#xff0c;简称 P…

飞腾X100适配Ubuntu说明

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…

强化学习的数学原理-01基本概念

state: T h e s t a t u s o f a g e n t w i t h r e s p e c t t o t h e e n v i r o n m e n t The \quad status \quad of \quad agent \quad with \quad respect \quad to \quad the \quad environment Thestatusofagentwithrespecttotheenvironment (agent 相对于环境的…

WPF 中的 StackPanel 详解

Windows Presentation Foundation&#xff08;WPF&#xff09;是微软开发的一种用于创建桌面客户端应用程序的用户界面框架。WPF 提供了一套丰富的控件和布局能力&#xff0c;使得开发者可以轻松构建出功能强大、视觉优美的用户界面。在 WPF 的布局系统中&#xff0c;StackPane…

【原创】java+ssm+mysql水费管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

StarRocks大批量数据导入方案-使用 Routine Load 导入数据

本文详细介绍如何使用Routine Load 导入数据 一、准备工作 1.1 安装基础环境 主要是安装StarRocks和Kafka&#xff0c;本文直接跳过不做详细介绍~ 二、概念及原理 2.1 概念 导入作业&#xff08;Load job&#xff09; 导入作业会常驻运行&#xff0c;当导入作业的状态为 R…

【Linux】了解pthread线程库,清楚并没有线程创建接口,明白Linux并不存在真正意义的线程(附带模型图详解析)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Liunx系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…