无向图邻接表的深度优先遍历(DFS)

2023-11-05

 邻接表是图的一种链式存储结构。对图的每个顶点建立一个单链表(n个顶点建立n个单链表)

 

头文件:Graph.h

#ifndef GRAPH_H
#define GRAPH_H
#define MAXSIZE 50
typedef char VertexType;  //顶点数据类型
typedef int EdgeType; //边权值类型
typedef struct edgenode{
	int adjvex;				//当前节点的下标值
	EdgeType weight;		//边的权值
	struct edgenode* next;  //边表的域,指向下一个边表节点
}EdgeNode;
typedef struct vertexnode{
	VertexType data;        //顶点的数据
	EdgeNode *pAdjNext;     //顶点的域,指向边表节点
}VertexNode,Vertex[MAXSIZE];
typedef struct graph{
	Vertex Vertexes;   //顶点节点
	int NumVertexes,NumEdges;
}Graph;
void CreateGraph(Graph *G);  //创建图
void DFS(Graph *G,int i);   //深度优先遍历算法
void DFSTraverse(Graph *G); //以深度优先遍历算法遍历图
#endif //GRAPH_H


实现文件:Graph.cpp

#include "Graph.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
bool visited[MAXSIZE];
void CreateGraph(Graph *G)
{
	EdgeNode *e = NULL;
	printf("请输入图的顶点数和边数:\n");
	scanf("%d%d",&G->NumVertexes,&G->NumEdges);
	printf("请输入图的顶点信息:\n");
	for(int i = 0;i < G->NumVertexes;++i)
	{
		fflush(stdin);	
		scanf("%c",&G->Vertexes[i].data);
		G->Vertexes[i].pAdjNext = NULL;
	}
	for(int k = 0;k < G->NumEdges;++k)
	{
		int i,j,w;
		e = (EdgeNode*)malloc(sizeof(EdgeNode));
		if(!e)
			exit(OVERFLOW);
		printf("请输入边的链接信息(vi,vj)及权值:\n");
		fflush(stdin);
		scanf("%d%d%d",&i,&j,&w);
		e->adjvex = j;
		e->weight = w;
		e->next = G->Vertexes[i].pAdjNext; //建立链表
		G->Vertexes[i].pAdjNext = e;
		//由于是无向图,存在反向链接
		e = (EdgeNode*)malloc(sizeof(EdgeNode));
		if(!e)
			exit(OVERFLOW);
		e->adjvex = i;
		e->weight = w;
		e->next = G->Vertexes[j].pAdjNext;
		G->Vertexes[j].pAdjNext = e;
	}
}
void DFSTraverse(Graph *G)
{
	for(int i = 0;i < G->NumVertexes;++i) //初始化图的各个顶点为false,未访问过
		visited[i] = false;
	for(int i = 0;i < G->NumVertexes;++i) 
		if(!visited[i])   //选取一个未访问过的顶点进行深度优先遍历,如果是连通图DFS只执行一次
			DFS(G,i);
}
void DFS(Graph *G,int i)
{
	visited[i] = true;
	printf("%c ",G->Vertexes[i].data);
	EdgeNode *p = G->Vertexes[i].pAdjNext; 
	while(p)
	{
		if(!visited[p->adjvex]) //如果边表结点没有被访问过,则递归调用DFS
			DFS(G,p->adjvex);
		p = p->next;
	}
}


测试文件main.cpp

#include "Graph.h"
int main()
{
	Graph G;
	CreateGraph(&G);
	DFSTraverse(&G);
	return 0;
}


 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无向图邻接表的深度优先遍历(DFS) 的相关文章

  • 如何重载“新”方法?

    我刚刚开始学习 Rust 我想知道是否有方法重载方法 首先 我创建了一个结构并使用 impl 来实现基本的 新 方法 然后我想添加带有一些参数的 新 方法 并且我尝试使用 Trait 来实现这一点 以下代码已成功编译 但是当我尝试将 new
  • 如何在iPhone应用程序中创建折线图? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • C# 中成员访问中的问号是什么意思?

    有人可以向我解释一下以下代码中会员访问中的问号是什么意思吗 它是标准 C 的一部分吗 尝试在 Xamarin Studio 中编译此文件时出现解析错误 this AnalyzerLoadFailed Invoke this new Anal
  • 自定义结构:类型不符合“可解码”协议

    我希望能够保存一个Custom struct to UserDefaults但为此我需要它Codable 我尝试过这样的 struct Wishlist Codable var name String var image UIImage v
  • 如何使用 Julia 查找矩阵中的连通分量

    假设我有以下矩阵 此处用 Julia 语言定义 mat 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 将一组值为 1 的相邻元素视为一个 分量 如何识别该矩阵有 2 个分量以及每个分量由哪些顶点组成 对于矩
  • JavaScript 将 NULL 转换为 0

    我正在使用 jQuery 来获取元素的高度 但如果该元素不存在 以下代码将返回 NULL height menu li active ul height returns integer or null 这是一种跨浏览器安全的方法 可以使用以
  • 求 Petersen 子图中的哈密顿路径

    我开始使用 IDE Jupyter Python 3 6 并出现了一个问题 我必须通过IDE绘制Petersen子图中的哈密顿路径 但我不知道该怎么做 我显示有关该图的信息 彼得森图 https en wikipedia org wiki
  • 如何在 Go 中表示可选字符串?

    我希望建模一个可以有两种可能形式的值 不存在或字符串 执行此操作的自然方法是Maybe String or Optional
  • 如何检查无向图是否有奇数环

    我试图找到一个 O V E 时间算法来检查是否已连接 无向图有或没有奇数环 我正在考虑对图进行广度优先搜索 并尝试将顶点标记为黑色和白色 以便没有两个标记为相同颜色的顶点相邻 是否有任何已知的更简洁的算法可以在线性时间内解决这个问题 你的方
  • C 中的空结构

    我有一个没有成员的结构 目前 我想知道是否可以抑制我收到的警告 warning struct has no members 是否可以添加会员并保留sizeof结构零 还有其他解决方案吗 在 c 中 空结构的行为取决于编译器 而在 c 中 空
  • 查询外键列可以为NULL的地方

    我想获取数据 如果orgid 2或者如果根本没有行uid orgid is an integer 我能想到的最接近的事情就是做IS NULL但我没有得到数据uid没有一个orgid排 任何想法 select u uid u fname u
  • ggplot2可以在一个图例中分别控制点大小和线大小(线宽)吗?

    一个使用的例子ggplot2绘制数据点组和连接每组均值的线 并使用相同的映射aes for shape并为linetype p lt ggplot mtcars aes gear mpg shape factor cyl linetype
  • 绘制点之间的所有线

    我有以下 R 代码 x lt c 0 01848598 0 08052353 0 06741172 0 11652034 y lt c 0 4177541 0 4042247 0 3964025 0 4074685 d lt data fr
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • 在 NetworkX 中使边缘更粗

    student id 0 1 2 3 4 5 6 7 8 9 10 11 12 0 131X1319 1 14 6 16 1 10 8 15 15 17 15 18 16 1 13212YX3 1 1 4 8 11 9 14 7 0 3 0
  • 确定数组的大小(如果传递给函数)

    如果将数组传递给另一个函数 未传递大小 是否可以确定数组的大小 数组的初始化类似于 int array XXX 我知道不可能执行 sizeof 因为它会返回指针的大小 我问的原因是因为我需要在传递数组的另一个函数内运行 for 循环 我尝试
  • 使用什么算法来确定使系统达到“零”状态所需的最小操作数?

    这是一种更通用的问题 不是特定于语言的 有关要使用的想法和算法的更多信息 系统如下 它登记朋友群体之间的小额贷款 Alice and Bill要去吃午饭 比尔的卡坏了 所以爱丽丝支付了他的餐费 10 美元 第二天Bill and Charl
  • C 位域内存使用情况

    我需要处理以下形式的一些数据 typedef struct unsigned n1 12 unsigned n2 12 unsigned n3 12 unsigned n4 1 unsigned n5 35 data 我确保它们总共最多有
  • 如何在 NHibernate 命名查询参数上设置 C# 可为空值类型值?

    我正在使用 NHibernate 并通过命名查询调用存储过程
  • Javascript 假值(null、未定义、false、空字符串:“”或 '' 和 0)和比较(==)运算符 [重复]

    这个问题在这里已经有答案了 当我使用任何一个值时 null undefined false 0 in a if陈述 它总是被评估为谬误 false 另外 这些值的否定 null undefined false 0 in a if语句总是被评

随机推荐

  • 亚马逊云科技实时 AI 编程助手 Amazon CodeWhisperer,开发快人一步!

    Amazon CodeWhisperer 是一款 AI 编码配套应用程序 可在 IDE 中生成整行代码和完整的函数代码建议 以帮助您更快地完成更多工作 在本系列文章中 我们将为您详细介绍 Amazon CodeWhisperer 的相关信息
  • 传输层——TCP报文头介绍

    16位源端口号 16位目的端口号 32位序列号 32位确认序列号 4位头部长度 保留6位 U R G A C K P S H R S T S Y N F I N 16位窗口大小 16位检验和 16位紧急指针 可选项 数据 源端口 长度为16
  • flex布局(骰子布局)

    1 应该都知道使用VS来敲写页面的第一步就是新建文件夹 也可以建文件夹 这是指只有html没有css与js才可以的 然后 可以在VS中打开文件夹 也可以直接把文件夹拖进去 这有两种方法 任意一种就行了 建议你直接拖进去 因为方便 2 这次的
  • Apache配置文件httpd.conf的理解

    httpd conf 是Apache使用的主要配置文件 1 文件位置 一般在 C wamp64 bin apache apache2 4 51 conf 2 是注释符号 1 解释每一指令的作用 2 指令模板 有时去掉 就能使用 3 Unix
  • Surprise库使用总结

    文章目录 Surprise库 1 加载数据模块 2 模型训练前的数据划分模块 2 1 交叉验证数据划分 2 2 训练集测试集划分 3 构建算法模块 3 1 记号说明 3 2 基于统计的算法 3 3 基于近邻 协同过滤 的方法 3 3 1 相
  • stata回归?固定效应模型(组内变换OR LSDV最小二乘法)

    面板数据分析与Stata应用笔记整理自慕课上浙江大学方红生教授的面板数据分析与Stata应用课程 笔记中部分图片来自课程截图 笔记内容还参考了陈强教授的 高级计量经济学及Stata应用 第二版 一 面板数据的定义 面板数据 panel da
  • 笔记本左Ctrl键失灵

    这两天发现笔记本的左Ctrl键单按失灵 无法使用快捷键 很是麻烦 一开始以为按键坏了 打算去官方店维修 但使用在线网站测试 先按其余任意按键的同时 再按左Ctrl 它有反应 可以使用在线键盘测试 zFrontier 装备前线对键盘按键进行在
  • vben admin框架 useForm 时间选择器 开始时间,结束时间解析.懒人方法

    因为搜索部分需要一个创建时间范围 因为DatePicker返回的是一个数组 开始自己在useTable 中的beforeFetch中拦截请求 然后解析参数 重组参数 这样有好多表格组件的时候 就需要写多个beforeFetch 然后闲来无事
  • 《新程序员002》图书正式上市! 从“新数据库时代”到“软件定义汽车”

    20年前 伴随着互联网打开信息化大门 技术人成为新时代的开拓者 在时代的召唤下 CSDN于2001年推出国内首个面向IT人员的专业杂志 程序员 成为一代代开发者的技术启蒙 20年后的今天 人工智能 云计算 大数据等新兴技术被赋予撬动新一轮产
  • 最有效的方法来增加在Map中的值

    关于这个是在一个博客上看到的 就像试一下 测试结果出人意料 看到这个标题可能还是觉得有点抽象 那么首先来一段代码 int count map containsKey string map get string 0 map put strin
  • 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

    给定一个包含 n 个整数的数组 nums 判断 nums 中是否存在三个元素 a b c 使得 a b c 0 找出所有满足条件且不重复的三元组 注意 答案中不可以包含重复的三元组 例如 给定数组 nums 1 0 1 2 1 1 4 满足
  • Linux的chmod

    chmod 命令是 Linux 系统中的一个重要命令 用于更改文件或目录的访问权限 chmod 命令可以设置文件或目录的所有者 所属组和其他用户的读 写 执行权限 通过 chmod 命令 用户可以控制文件或目录的访问权限 以保护重要数据不被
  • KVM学习(一)vnc连接

    完整流程Windows连接CentOS7 这个KVM系列是我的本科毕业设计 边学边做 长期更新 1 安装vncserver 首先看下实验环境 windows上跑的vmware虚拟机 vncserver安装在虚拟机上 虚拟机已经安装好了gno
  • 游戏服务器维护是干啥的,网络游戏的服务器维护都是在做些什么?

    来 我作为前网易游戏从业人员来说说真正服务器维护时候在做什么 服务器维护分成两种 紧急维护和日常维护 1 紧急维护 紧急维护一般就是硬件故障或者严重Bug 这个时候是各个团队最紧张的时候 每个团队都忙个不停 运营团队会发布公告 安慰玩家 统
  • 黑马JAVA P174 线程池概述、线程池的7个参数详解

  • Java Spring注解二:参数请求@RequestParam和@RequestBody

    作为一名crud boy 关于web请求 接口处理基本是家常便饭 涉及到这些中间肯定少不了请求参数 毕竟要根据请求参数才能进行相应的操作 返回预想的结果 一般来说我们web请求参数是不能直接通过http请求来代码识别的 所以你必须要通过注解
  • 关于上采样方法总结(插值和深度学习)

    一 简介 上采样的技术是图像进行超分辨率的必要步骤 最近看到了CVPR2019有一些关于上采样的文章 所以想着把上采样的方法做一个简单的总结 看了一些文章后 发现上采样大致被总结成了三个类别 1 基于线性插值的上采样 2 基于深度学习的上采
  • 十大经典排序算法动画与解析

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 排序算法是 数据结构与算法 中最基本的算法之一 排序算法可以分为内部排序和外部排序 内部排序是数据记录在内存中进行排序 而外部排序是因排序的数据很大 一次不能容纳全部的排序
  • python画图

    python画图 导入模块numpy 命名为np方便后续使用 import numpy as np numpy可进行数组和矩阵运算 提供大量的数学函数库 import matplotlib pyplot as plt matplotlib是
  • 无向图邻接表的深度优先遍历(DFS)

    邻接表是图的一种链式存储结构 对图的每个顶点建立一个单链表 n个顶点建立n个单链表 头文件 Graph h ifndef GRAPH H define GRAPH H define MAXSIZE 50 typedef char Verte