深度、广度优先遍历(邻接表)

news2024/12/27 13:00:28
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<queue>
#define MAXVEX 20
typedef char VertexType;
using namespace std;

//边表结点
typedef struct EdgeNode{
	int adjvex;
	struct EdgeNode *next;
}EdgeNode;

//顶点结点
typedef struct VertexNode{
	VertexType data;
	EdgeNode *firstedge;
}VertexNode, AdjList[MAXVEX];

typedef struct{
	AdjList adjlist;
	int numVertexes, numEdges;
}GraphAdjList; 

//将输入的字符转换为对应的下标 
int get_index(AdjList arr, char m){
	for(int i = 0; i < MAXVEX; i++){
		if(arr[i].data == m)
			return i;
	}
	return -1;
}

//创建图
void Create(GraphAdjList &G){
	int i, j, k;
	EdgeNode *p;
	
	cout << "请输入顶点数和边数:" << endl;
	cin >> G.numVertexes >> G.numEdges;
	
	//输入顶点信息
	cout << "输入顶点信息:" << endl;
	for(i = 0; i < G.numVertexes; i++){
		cin >> G.adjlist[i].data;
		G.adjlist[i].firstedge = NULL;   //初始化为空 
	}
	
	//建立边表
	cout << "输入边(vi,vj)中的下标i,j:" << endl;
	for(k = 0; k < G.numEdges; k++){
		cin >> i >> j;
		p = (EdgeNode *)malloc(sizeof(EdgeNode));
		p->adjvex = j;   //存储弧头 
		p->next = G.adjlist[i].firstedge;  //头插法插入边结点 
		G.adjlist[i].firstedge = p;
		
		//无向图 
		p = p = (EdgeNode *)malloc(sizeof(EdgeNode));
		p->adjvex = i;
		p->next = G.adjlist[j].firstedge;
		G.adjlist[j].firstedge = p;
	} 
}

//打印邻接表 
void print(GraphAdjList &G){
	cout << "邻接表为:" << endl;
	EdgeNode *p;
	for(int i = 0; i < G.numVertexes; i++){
		p = G.adjlist[i].firstedge;
		while(p){
			cout << "<" << G.adjlist[i].data << "," << G.adjlist[p->adjvex].data << ">";
			p = p->next;
		}
		cout << endl;
	}
}

//深度优先遍历 
void dfs(GraphAdjList &G, int v, int* visited){
	visited[v] = 1;
	cout << G.adjlist[v].data;
	EdgeNode *p = G.adjlist[v].firstedge;
	while(p){
		if(!visited[p->adjvex])
			dfs(G, p->adjvex, visited);
		p = p->next;
	}
	return ;
}

void dfsSearch(GraphAdjList &G, char input){
	int visited[MAXVEX] = {0};
	for(int i = 0; i < G.numVertexes; i++){
		visited[i] = 0;
	}
	dfs(G, get_index(G.adjlist, input), visited);
	
	for(int i = 0; i < G.numVertexes; i++){
		if(!visited[i]){
			dfs(G, i, visited);
		}
	}
}

//广度优先遍历 
void bfs(GraphAdjList &G, int v, int* visited){
	int u, w;
	EdgeNode *p;
	queue<int> Q;
	cout << G.adjlist[v].data;
	
	visited[v] = 1;
	Q.push(v);
	while(!Q.empty()){  //如果队列不为空 
		u = Q.front();  //取出队头元素赋值给u 
		Q.pop();
		p = G.adjlist[u].firstedge;
		while(p){  //一次检查u的所有邻接点 
			w = p->adjvex;
			if(!visited[w]){
				cout << G.adjlist[w].data;
				visited[w] = 1;
				Q.push(w);
			}
			p = p->next;
		}
	}
} 

void bfsSearch(GraphAdjList &G, char input){
	int visited[MAXVEX] = {0};
	for(int i = 0; i < G.numVertexes; i++){
		visited[i] = 0;
	}
	
	bfs(G, get_index(G.adjlist, input), visited);
	
	for(int i = 0; i < G.numVertexes; i++){
		if(!visited[i]){
			bfs(G, i, visited);
		}
	}
}

/*
A B C D E
0 1 
0 3 
1 4
1 2
2 3
2 4
*/

int main(){
	GraphAdjList G;
	Create(G);
	print(G);
	cout << "输入深度搜索的起始点:" << endl;
	char input;
	cin >> input;
	dfsSearch(G, input);
	
	cout << endl << "输入广度搜索的起始点:" << endl;
	cin >> input;
	bfsSearch(G, input);
	
} 

连通图案例

在这里插入图片描述

非连通图案例

在这里插入图片描述

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

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

相关文章

Spring Cloud:构建微服务的最佳实践

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

手机木马远程控制复现

目录 目录 前言 系列文章列表 渗透测试基础之永恒之蓝漏洞复现http://t.csdn.cn/EsMu2 思维导图 1&#xff0c;实验涉及复现环境 2,Android模拟器环境配置 2.1,首先从官网上下载雷电模拟器 2.2,安装雷电模拟器 2.3, 对模拟器网络进行配置 2.3.1,为什么要进行配置…

vagrant 虚拟机扩容磁盘

vagrant 虚拟机扩容磁盘 修改配置安装插件存储扩容 修改配置 参考博客:https://blog.csdn.net/marina_1/article/details/122238721 vagrant 版本 PS D:\vagrant\workplace\node2> vagrant --version Vagrant 2.3.7修改vagrant虚拟机配置文件Vagrantfile&#xff0c;添加磁…

互斥锁,自旋锁,读写锁

目录 互斥体 互斥锁 属性 使用流程&#xff08;相关API函数&#xff09; 互斥锁初始化和销毁的函数原型&#xff1a; 互斥锁的上锁和解锁的函数原型为&#xff1a; pthread_mutex_init() 定义 函数原型 返回值 初始化 pthread_mutex_destroy() 定义 函数原型 pt…

EasyAVFilter代码示例之将视频点播文件转码成HLS(m3u8+ts)视频点播格式

以下是一套完整的视频点播功能开发源码&#xff0c;就简简单单几行代码&#xff0c;就可以完成原来ffmpeg很复杂的视频点播转码调用流程&#xff0c;而且还可以集成在自己的应用程序中调用&#xff0c;例如java、php、cgo、c、nodejs&#xff0c;不需要再单独一个ffmpeg的进程来…

mongodb7.0安装全过程详解

mongodb安装全过程详解 安装mongodb环境安装mongodb shell 安装mongodb环境 进入mongodb官网下载社区版服务器 点击跳转下载地址 选择适应自己系统的版本&#xff0c;然后下载 下图为下载后的文件&#xff0c;双击进行安装 需要注意的两个点 ①选择完整安装 ②不下载mongo…

C语言深入理解指针(非常详细)(五)

目录 回调函数qsort使用举例qsort函数的模拟实现sizeof和strlen的对比sizeofstrlensizeof和strlen的对比一道关于sizeof的题 回调函数 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指…

状态管理Pinia

Vue3 状态管理 - Pinia 1. 什么是Pinia Pinia 是 Vue 的专属的最新状态管理库 &#xff0c;是 Vuex 状态管理工具的替代品 2. 手动添加Pinia到Vue项目 后面在实际开发项目的时候&#xff0c;Pinia可以在项目创建时自动添加&#xff0c;现在我们初次学习&#xff0c;从零开始…

DockerFile打包项目实战解析,一文读懂dockerfile打包

文章目录 一、简介二、DockerFile基础1. DockerFile的作用和特点2. DockerFile语法介绍3. 基本指令&#xff1a;FROM、RUN、COPY、ADD等 三、编写具体项目使用DockerFile四、构建镜像1.项目构建默认命令dockerfile文件非默认命令dockerfile文件小知识 2. 使用ENTRYPOINT和CMD指…

C++11 新特性 ⑥ | 智能指针 unique_ptr、shared_ptr 和 weak_ptr

目录 1、引言 2、unique_ptr 3、shared_ptr 4、weak_ptr 5、shared_ptr循环引用问题&#xff08;面试题&#xff09; VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/detai…

Java之List集合的解析及泛型的概述

4.List集合的实现类 4.1List集合子类的特点【记忆】 ArrayList集合 底层是数组结构实现&#xff0c;查询快、增删慢 LinkedList集合 底层是链表结构实现&#xff0c;查询慢、增删快 4.2LinkedList集合的特有功能【应用】 特有方法 方法名说明public void addFirst(E e)在该…

小白备战大厂算法笔试(五)——树

文章目录 二叉树常用术语初始化插入与删除常见类型满二叉树完全二叉树完满二叉树平衡二叉树 二叉树退化二叉树遍历层序遍历前序、中序、后序遍历 数组表示二叉树表示完美二叉树表示任意二叉树 二叉搜索树查找节点插入节点删除节点遍历有序搜索效率常见应用 二叉树 二叉树是一种…

Dynamic CRM开发 - 实体窗体(一)

CRM创建一个实体以及实体字段后,在实体窗体里拖动字段和简单配置,就可以实现一个新增和编辑实体数据的表单,这种无代码的操作形式对非程序员非常的友好。 实体有四种类型的窗体:主窗体、快速视图窗体、快速创建窗体、卡窗体。 窗体区别如下: 窗体操作说明: 1、启用安全…

Windows定时任务实现开机自启动

Windows定时任务实现S11开机自启动 Windows键加 r 键打开运行窗口&#xff0c;然后输入control打开控制面板。

Linux内核分析与应用2-内存寻址

本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好&#xff0c;推荐观看 留此记录&#xff0c;蜻蜓点水,可作抛砖引玉 2.1 内存寻址 数据连续存储和选择读取思想,是目前我们使用的几乎所有机器运行背后的灵魂 计算机体系结构中的核心问题之一,就是如…

python28种极坐标绘图函数总结

文章目录 基础图误差线等高线polar场图polar统计图非结构坐标图 &#x1f4ca;python35种绘图函数总结&#xff0c;3D、统计、流场&#xff0c;实用性拉满 matplotlib中的画图函数&#xff0c;大部分情况下只要声明坐标映射是polar&#xff0c;就都可以画出对应的极坐标图。但…

深入浅出AXI协议(6)——传输属性

一、前言 在之前的文章中&#xff0c;我们介绍的主要内容是AXI协议的数据读写结构和读写响应结构&#xff0c;主要讲述了当遇到各种特殊情况时,AXI如何完成数据的读写操作&#xff0c;最后介绍了读写响应的4种类型。 在本文中&#xff0c;我们将介绍AXI协议的传输属性。 二、传…

centos7的yum修改为阿里源

yum修改为阿里源 1.安装wget yum install -y wget2.备份与下载源 cd /etc/yum.repos.d mv -f CentOS-Base.repo CentOS-Base.repo.backup wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo mv epel.repo epel.repo.backup # 有些系…

C++引用与移动语义

目录 一.引用分类 1.名词解释 1).左右值 二.引用&#xff08;左值引用&#xff09; 1.左值引用&#xff08;Lvalue Reference&#xff09;&#xff1a; 2.本质 3.形式 4.注意 5.示例 1&#xff09;引用做左值 2&#xff09;引用做函数返回值 三.右值引用 1.右值引…

代码随想录算法训练营day|139.单词拆分|多重背包基础力理论| 背包总结

139.单词拆分 力扣题目链接 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明&#xff1a; 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1&#xff1a…