邻接表创建

2023-10-27

    邻接矩阵是个不错的图储存结构,但我们发现,对于边数相对顶点较少的图,这种结构是存在对储存空间的极大浪费的(关于邻接矩阵的相关知识在这里:邻接矩阵的创建),因此我们要考虑另外一种存储结构方式。

    我们在学习线性表时就注意到顺序存储结构预先分配空间会导致空间浪费的问题,于是我们引出了链式存储结构,所以我们也可以通过链式存储来储存图的边和弧解决空间浪费的问题。

    我们可以将顶点存入数组,再将顶点的邻接点进行链式存储,这种数组与链表相结合的储存方式称为邻接表。

    无向图邻接表的图示:

 有向图邻接表图示:

 ps:以上图均来自大话数据结构

知道了最后实现出来的图像我们便可以很轻松的编写程序了

    1.边表结点的结构

//边表结点
struct EdgeNode
{
	//邻结点域储存顶点的下标
	int adjvex;
	//权值
	InfoType m_info;
	//指向下一个边表结点的指针
	EdgeNode* next;
};

    2.顶点表结点结构

struct VertexNode
{
	//顶点
	VetexType vetex;
	//指向边表的头指针
	EdgeNode* FirstEdge;
};

    3.邻接表结构体

//邻接表
struct GraphAdiList
{
	//顶点数组
	VertexNode Adjext[MAXSIZE];
	//顶点个数,边条数
	int numVertex, numEdges;
};

    4.创建邻接表

//创建邻接表
void CreaterADGraph(GraphAdiList& G)
{
	int m, n,info;
	cout << "请输入顶点个数和边条数" << endl;
	cin >> G.numVertex >> G.numEdges;
	//初始化顶点表
	for (int i = 0; i < G.numVertex; i++)
	{
		cout << "请输入第" << i + 1 << "个顶点" << endl;
		//初始化顶点表中的两个属性
		cin >> G.Adjext[i].vetex;
		G.Adjext[i].FirstEdge = NULL;
	}
	//创建边表
	for (int k = 0; k < G.numEdges; k++)
	{
		EdgeNode* p;
		p = new EdgeNode;
		cout << "请输入边(vm,vn)上的顶点序号(m,n)和权值" << endl;
		cin >> m >> n>>info;
		//初始化创建的边表结点p
		p->adjvex = n-1;
		p->m_info = info;
		//将边表结点p按头插法插入邻接表
		p->next = G.Adjext[m - 1].FirstEdge;
		G.Adjext[m - 1].FirstEdge = p;
		//由于该图是无向图所以还要考虑(n,m)的情况
		p = new EdgeNode;
		p->adjvex = m - 1;
		p->m_info = info;
		p->next = G.Adjext[n - 1].FirstEdge;
		G.Adjext[n - 1].FirstEdge = p;
	}
	cout << "邻接表创建完成" << endl;
}

   我们创建邻接表默认创建的是无向图的邻接表,所以一条边要进行两次储存,创建两个边表的结点。

    5,输出检验邻接表是否创建成功

/查找边的权值(用来检验邻接表是否创建成功)
void Find_ADGraph(GraphAdiList& G)
{
	//用来遍历边表
	EdgeNode* p;
	int m, n;
	cout << "请输入边(vm,vn)上的顶点序号(m,n)" << endl;
	cin >> m >> n;
	p = G.Adjext[m - 1].FirstEdge;
	while (p)
	{
		if (p->adjvex == n - 1)
		{
			cout << "边" << G.Adjext[m - 1].vetex << "," << G.Adjext[p->adjvex].vetex << "的权值为:" << p->m_info << endl;
			return;
		}
		p = p->next;
	}
	cout << "没有这条边" << endl;

}

   调试的过程及其结果:

 

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

邻接表创建 的相关文章

随机推荐

  • 3-排序算法

    冒泡排序 冒泡排序的思路是将每两个数据之间进行大小比对 将大的数据后移 反复比对移动数据 直至数组排列整齐 include
  • Vosviewer+Pajek实现知网社交网络(解决中文乱码问题)

    Vosviewer Pajek实现知网社交网络 一 软件准备 Vosviewer安装 下载地址https www vosviewer com download 安装JDKhttps www oracle com java technolog
  • Python+Selenium_UI自动化操作(3)——刷新页面

    UI自动化 刷新页面 语法 refresh class TestRefreshWeb unittest TestCase def setUp self setUp是一个初始化方法 为test案例做数据准备 当前方法的数据准备动作是 启动ch
  • MQTT通讯协议简介和测试 [MQTT.fx]

    一 介绍 1 MQTT简介 MQTT Message Queuing Telemetry Transport 消息队列遥测传输 是IBM开发的一个即时通讯协议 有可能成为物联网的重要组成部分 该协议支持所有平台 几乎可以把所有联网物品和外部
  • 使用 POI创建一个简单的 Excel 文件

    初级程序员一枚 看到公司大佬写的生成Excel文件 做下记录 同时也分享给大家参考 实现原理是用workBook 然后还有OutputStream 首先是一个ExcelDataBean 这个实体类 用来 声明 Excel的最大行数 最大列数
  • 用tornado ,Supervisord ,nginx架网站

    最近使用 Tornado 重写了博客 于是查看了很多关于部署基于 Tornado 开发的网站的资料 比较成熟的方案就是使用 Nginx 来做反向代理 使用 Supervisord 来作为进程管理工具 至于什么叫反向代理 为什么 Tornad
  • 小鱼深度产品测评之:阿里云低代码开发平台魔笔,一站式的应用全生命周期管理,高效解决应用研发、迭代、运维的问题。

    低代码开发平台魔笔测评 1 引言 2 购买流程 3 魔笔 3 1添加应用 3 2 应用列表 3 1 1 列表应用展示 3 2 1 列应用操作 3 2 1 1 自动保存 3 2 1 2 复制功能 3 2 1 3 编辑功能 3 2 1 4 删除
  • (二)Android导航栏和菜单资源的结合使用

    ActionBar是Android3 0的重要更新之一 位于传统标题栏的位置 1 注意在使用ActionBar时保证该应用的目标版本应高于11 Android3 0的版本号
  • 知乎Python大佬带你10分钟入门Python爬虫(推荐收藏)

    一 基础入门 1 1 什么是爬虫 爬虫 spider 又网络爬虫 是指向网站 网络发起请求 获取资源后分析并提取有用数据的程序 从技术层面来说就是 通过程序模拟浏览器请求站点的行为 把站点返回的HTML代码 JSON数据 二进制数据 图片
  • 《软件调试的艺术》笔记--调试多线程程序

    下面是于线程相关的GDB命令用法汇总 info threads 给出关于当前所有线程的信息 thread 3 改成线程3 break 88 thread 3 当线程到达源代码88时停止执行 break 88 thread 3 if i 2
  • LaTeX教程(三)——文档格式排版

    文章目录 1 章节目录 1 1 生成章节 1 2 生成目录 2 交叉引用和脚注 2 1 交叉引用 2 2 脚注 3 特殊环境 3 1 列表 3 2 文本对齐 3 3 引用环境 3 4 代码环境 1 章节目录 1 1 生成章节 写文章或者论文
  • 关于程序员认知和编程学习,没有任何一篇文章会讲得如此透彻

    程序猿问科比 你为什么这么成功 科比 你知道洛杉矶凌晨四点是什么样子吗 程序猿 知道 一般那个时候我还在写代码 怎么了 科比 额 你以为程序员都是这样生活的 别瞎 他们只是在历劫 度过这段日子 他们就飞升上仙 乃至上神 过上另一种生活 就像
  • 【北京工业大学申请个人学生邮箱】

    北京工业大学申请个人学生邮箱 由于近期想要购买苹果设备 但是苹果更新了unidays认证 需要用到学生邮箱认证 因此花了几个小时查找北工大的邮箱注册方法 一趟下来 说实在的流程有些阴间 在此进行下记录 也方便后人的查找 一 进入 内网综合服
  • 商品上架、es应用到商品上架-35

    一 商品上架 上架的商品才可以在网站展示 上架的商品需要可以被检索 es是将数据保存到内存当中 所以我们不能将什么数据都保存到es当中 我们需要将重要的数据保存到es中 例如商品名称 规格型号 价格等信息 当需要的数据较多时 我们可以将主键
  • 我的博客地图

    最新更新时间 2020年03月12日11 37 13 猛戳 查看我的博客地图 总有你意想不到的惊喜 我的博客首页 我的博客创作中心 前端漫漫路 我的GitHub 我的站点 前言 由于自己写的文章越来越多 查看和查找具体内容变得格外耗时 因此
  • 【算法学习笔记】26:匈牙利算法(二分图最大匹配)

    1 简述 给定一个二分图 例如 匈牙利算法能够快速的计算出一种匹配方式 使得匹配的数量最多 注意 一个成功的匹配方式中 没有两条边是共用了同一个点的 形象的说 这个问题可以理解成二分图两边分别是男生和女生 有连线的表示可以凑成一对 匈牙利算
  • Flutter控件封装之视频进度条

    视频控制器 三方所提供的样式 有时很难满足我们的需求 对于此情况 我们不得不在此基础上自行封装 今天所分享的文章就是一个很简单的控制器封装案例 包含了基本的播放暂停 全屏和退出全屏 以及时间和进度的展示 封装了事件回调以及各个属性的控制 基
  • 英语快速记忆-后缀

    英语快速记忆 后缀 后缀在缀合法中只起改变词性的作用 不改变词根的含意 因词性不同 后缀可分为名词性 形容词性 动词性及副词性后缀 现列举于下 一 名词性后缀 1 age为抽象名词后缀 表示行为 状态和全体总称percentage百分数 百
  • 【idea】IDEA中TODO以及FIXME等关键字不高亮显示修复

    1 概述 最近突然碰到IDEA中TODO以及FIXME关键字不高亮显示的问题 同时TODO标签页无法搜索 如下 开始我的小写的显示颜色 大写的不显示颜色 后来发现这里区分大小写 同时在这里可以配置颜色 其他几个地方配置的好像不管用 如果配置
  • 邻接表创建

    邻接矩阵是个不错的图储存结构 但我们发现 对于边数相对顶点较少的图 这种结构是存在对储存空间的极大浪费的 关于邻接矩阵的相关知识在这里 邻接矩阵的创建 因此我们要考虑另外一种存储结构方式 我们在学习线性表时就注意到顺序存储结构预先分配空间会