【大话数据结构C语言】37 图的抽象数据类型

本文详细探讨了如何在C语言中实现图的抽象数据类型,内容涵盖图的基本概念、数据结构以及操作方法,旨在帮助读者深入理解数据结构中的图论知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的首发平台是公众号【CodeAllen】,学习交流QQ群:736386324,转载请注明出处

ADT 图 (Graph)

Data
    顶点的有穷非空集合和边的集合
Opeation
	CreateGraph(*G,V,VR): 按照顶点集V和边弧集VR的定义构造图
	DestroyGraph(*G): 图G存在则销毁
	LocateVex(G,u): 若图G中存在顶点u,则返回图中的位置
	GexVex(G,v,) 返回图G中顶点v的值
	PutVex(G,v,value) 将图G中顶点v赋值给value
	FirstAdjwet(G,*V) 返回顶点v的一个邻接顶点,若顶点在G中 无邻接顶点则返回空
	NextAdjVex(G,v,*w)返回顶点v相对于w的下一个邻接顶点,若w是v的最后一个邻接点则返回空。
	InsertVex(*G,v) 在图G中新增顶点v及相关的弧
	DeleteVex(*G,v,w)删除图G中顶点v及相关的弧
	InsertArc(*G,v,w) 在图G中顶点增添弧<v,w>若G是无向图 还需要增添对称弧<w,v>
	DelectArc(*G,v,w)在图G中删除弧<v,w>若G是无向图,则还需删除对称弧<w,v>
	DFSTraverse(G)对图中进行深度优先遍历,在遍历过程中对每个顶点调用
	HFSTraverse(G)对图中进行广度优先遍历,在遍历过程对每个人调用
endADT

 

一、 题目:抽象数据类型实现 利用VC++的工作环境实现教材里的基本抽象数据类型。按照课本的要求运用c语言以及数据结构课程所学的知识,设计合理的数据存储结果,实现的基本操作。 二、 抽象数据类型定义以及各基本操作的简要描述 ADT MGraph{ 数据对象:n=n是具有相同特征的数据元素集合,称为顶点集。 数据关系:DR={<v,w>|v,w∈n且<v,w>表示从v指向w的弧} 基本操作: CreateMGraph 初始条件:n是的顶点集,e是的边集 操作结果:按和n的e定义构造G DestroyGraph 初始条件: G存在 操作结果: 销毁G GetVex 初始条件: G存在,v是G中某个顶点 操作结果: 返回v的值 LocateVex 初始条件:G存在,v和G中顶点有相同特征 操作结果:若G中存在顶点v,则返回该顶点再中的位置;否则返回空 PutVex 初始条件: G存在,v是G中某个顶点 操作结果: 对v赋值u FirstAdjVex 初始条件: G存在,v是G中某个顶点 */ 操作结果: 返回的第一个邻接顶点。若顶点在G中没有邻接顶点,则返回空 NextAdjVex 初始条件: G存在,v是G中某个顶点,w是v的邻接顶点 操作结果: 返回v(相对w)的下一个邻接顶点。若w是v的最后一个邻接点,则返回空 InsertVex 初始条件: G存在,v和G中顶点有相同特征 操作结果: 在G中增添新顶点v(不增添与顶点相关的边,留待InsertArc()去做) DeleteVex 初始条件: G存在,v是G中某个顶点 操作结果: 删除G中顶点v及其相关的弧 InsertArc 初始条件: G存在,v和W是G中两个顶点 操作结果: 在G中增添弧<v,w> DeleteArc 初始条件: G存在,v和w是G中两个顶点 操作结果: 在G中删除弧<v,w> DFSTraverseM 初始条件:G存在 操作结果:对进行深度优先遍历 BFSTraverseM 初始条件:G存在 操作结果:对进行广度优先遍历 }ADT MGraph
平衡二叉树是一种特殊的二叉搜索树,它的左右子树的高度差不超过1,这样可以保证平衡二叉树的查找、插入和删除操作的时间复杂度都是O(log n)。 平衡二叉树有很多种,其中比较常见的有AVL树、红黑树、B树等。在本文中,我们主要介绍AVL树。 AVL树是一种严格平衡的二叉搜索树,它的每个节点的左右子树高度差不超过1。当节点的高度差超过1时,就需要通过旋转操作来重新平衡。AVL树的特点是:对于一个节点,其左右子树的高度差不超过1,且左右子树都是AVL树。 插入操作 插入操作是AVL树中比较复杂的操作,因为插入一个节点可能导致整个树失去平衡。下面是AVL树的插入操作: 1. 在AVL树中插入一个节点,首先按照二叉搜索树的规则找到插入的位置。 2. 如果插入节点后,其父节点的左右子树高度差不超过1,则不需要进行旋转操作,直接返回。 3. 如果插入节点后,其父节点的左右子树高度差超过1,则需要进行旋转操作。 4. 如果插入节点在父节点的左子树中,并且插入节点的左子树高度大于插入节点的右子树高度,则进行右旋操作;如果插入节点在父节点的右子树中,并且插入节点的右子树高度大于插入节点的左子树高度,则进行左旋操作。 5. 如果插入节点在父节点的左子树中,并且插入节点的左子树高度小于插入节点的右子树高度,则进行左右旋转操作;如果插入节点在父节点的右子树中,并且插入节点的右子树高度小于插入节点的左子树高度,则进行右左旋转操作。 删除操作 删除操作也是AVL树中比较复杂的操作,因为删除一个节点可能导致整个树失去平衡。下面是AVL树的删除操作: 1. 在AVL树中删除一个节点,首先按照二叉搜索树的规则找到要删除的节点。 2. 如果要删除的节点没有子节点,则直接删除即可。 3. 如果要删除的节点只有一个子节点,则将子节点替换成要删除的节点。 4. 如果要删除的节点有两个子节点,则先找到要删除节点的后继节点(即右子树中最小的节点),将后继节点的值赋给要删除的节点,然后将后继节点删除。 5. 删除一个节点可能会导致整个树失去平衡,因此需要进行旋转操作。 6. 如果删除节点后,其父节点的左右子树高度差不超过1,则不需要进行旋转操作,直接返回。 7. 如果删除节点后,其父节点的左右子树高度差超过1,则需要进行旋转操作。 8. 如果删除节点在父节点的左子树中,并且删除节点的左子树高度大于删除节点的右子树高度,则进行右旋操作;如果删除节点在父节点的右子树中,并且删除节点的右子树高度大于删除节点的左子树高度,则进行左旋操作。 9. 如果删除节点在父节点的左子树中,并且删除节点的左子树高度小于删除节点的右子树高度,则进行左右旋转操作;如果删除节点在父节点的右子树中,并且删除节点的右子树高度小于删除节点的左子树高度,则进行右左旋转操作。 总结 AVL树是一种严格平衡的二叉搜索树,它的每个节点的左右子树高度差不超过1。插入和删除操作可能会导致整个树失去平衡,需要通过旋转操作来重新平衡。AVL树比较适合用于读取操作比较频繁的场景,因为它的查找、插入和删除操作的时间复杂度都是O(log n)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeAllen嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值