【数据结构】算法题:邻接表构造相应的逆邻接表

这篇具有很好参考价值的文章主要介绍了【数据结构】算法题:邻接表构造相应的逆邻接表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

编写算法:根据含有n个顶点的有向图邻接表,构造相应的逆邻接表。

1.算法的思想:
邻接表和逆链接表的顶点信息是相同的,直接复制即可。把出边信息转换成入边信息,则需要逐一访问邻接表的各结点的出边表,把边结点通过头插法插入相应的入边表中。

2.算法的实现:

typedef struct node{		/*边表结点*/	
	int adjvex;				/*邻接点域*/	
	struct node * next;		/*指向下一个邻接点的指针域*/	
}EdgeNode;					/*若要表示边上信息,则应增加一个数据域info*/	

typedef struct ArcNode{
	int adjvex;				//该边所指向的结点的位置	
	ArcNode *nextarc;		//指向下一条边的指针	
}ArcNode;

typedef struct vnode{		/*顶点表结点*/	
	char vertex [20];		/*顶点域*/	
	EdgeNode *firstedge;	/*边表头指针*/	
	ArcNode *firstarc;		//指向第一条边的指针	
}VertexNode;

/*AdjList是邻接表类型*/	
typedef VertexNode AdjList[MaxVerNum];	

typedef struct {
	AdjList adjlist;		/*邻接表*/	
	int n,e;				/*顶点数和边数*/	
}ALGraph;

//将有向图的出度邻接表改为按入度建立的逆邻接表
void InvertAdjList(AdjList ginAdjList gout)
{
	int j;
	ArcNode *s;
	for(i=1;i<=n;i++)	   //设有向图有n个顶点,建逆邻接表的顶点	
	{
		gin[i].vertex==gout[i].vertex;	//邻接表和逆链接表的顶点信息是相同的,直接复制即	
		gin.firstarc=null;	//指向第一条边的指针为空	
	}
	for(i=1;i<=n;i++)	  //邻接表转为逆邻接表	
	{
		p=gout[i].firstarc;	//取指向邻接表的指针	
		while(p!=null){
			j=p->adjvex;	  			//该边所指向的结点的位置	
			s=(rcNode*)malloc(sizeof(ArcNode));	//申请结点空间	
			s->adjvex=i;	   			//把边结点通过头插法 插入到相应的入边表	
			s->next=gin[j].firstarc; gin[j].firstarc=s;
			p=p->next;					//下一个邻接点	
		}
	}
}

举个栗子:
【数据结构】算法题:邻接表构造相应的逆邻接表
邻接表:
【数据结构】算法题:邻接表构造相应的逆邻接表
逆邻接表:
【数据结构】算法题:邻接表构造相应的逆邻接表
注:
一个稀疏图顶点个数为n,边数为e。为了解决在存储稀疏图邻接矩阵(使用存储空间 n2 )浪费空间的这一劣势,引入邻接表( n+2e)来减少存储空间的浪费。
邻接表虽然在空间上有很大的优势,但是对于有向图来说,若需查找入度的个数就需要遍历整个邻接表,所以也不方便,效率有点低哦,解决这个问题有两种方法:
1:十字交叉链表
2:逆邻接表(与邻接表共同使用,达到更好的效果)文章来源地址https://www.toymoban.com/news/detail-508679.html

  • 邻接表:某顶点链表的结点个数是发出去的弧的数量,也就是出度。
  • 逆邻接表:某顶点链表的结点个数是进入的弧的数量,也就是入度。
  • 邻接表反映的是结点的出度邻接情况,逆邻接表反映的是结点的入度邻接情况。

到了这里,关于【数据结构】算法题:邻接表构造相应的逆邻接表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法与数据结构】106、LeetCode从中序与后序遍历序列构造二叉树

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :首先我们要知道后序遍历数组的最后一个元素必然是根节点,然后根据根节点在中序遍历数组中的位置进行划分,得到根节点的左右子树遍历数组,以此递归。当然这里有一个前提

    2024年02月10日
    浏览(41)
  • 【数据结构】邻接矩阵和邻接图的遍历

    本篇文章开始学习数据结构的图的相关知识,涉及的基本概念还是很多的。 本文的行文思路: 学习图的基本概念 学习图的存储结构——本文主要介绍邻接矩阵和邻接表 对每种结构进行深度优先遍历和广度优先遍历 话不多说,狠活献上 等等,先别急,正式学习之前先认识几个

    2024年02月04日
    浏览(52)
  • 数据结构——图的基本定义以及图的存储结构,邻接矩阵,邻接表

    目录 图的定义和术语 图的存储结构 顺序存储结构—邻接矩阵 链式存储结构 邻接表 邻接多重表 十字链表 图的遍历 图的连通性问题 有向无环图及其应用 最短路径 图的定义:图是一种非线性的复杂的数据结构,图中的数据元素的关系是多对多的关系 ,在图中我们常常把数

    2024年02月04日
    浏览(58)
  • C++数据结构之图的存储结构——邻接矩阵和邻接表实现无向图

    关键点: 1.构建二维数组 2.对应边的位置赋值为1 由于比较简单就直接上代码: 个人对邻接表实现无向图的理解如下,仅供参考:         由于无向图的组成是由多个顶点和多条无向边组成的,因此我们可以把它拆分成两个结构,分别是顶点和无向边,又由于我们是使用

    2024年02月05日
    浏览(55)
  • 【数据结构】邻接矩阵法

    顶点用一维数组Vex表示,其中可存放较为复杂的信息(如下标),边表用二维数组Edge表示,存放边的信息(两顶点之间有直接相连的边为1,否则为0)。  如何求顶点的入度 、出度? 对于无向图  第 i 个节点的度: 该结点所在行列的非0元素个数 对于有向图  第i个节点的

    2024年02月12日
    浏览(60)
  • 数据结构之邻接表

    邻接表是一种表示图的数据结构,它通过链表的形式,将每个节点的邻居节点记录下来。具体原理如下: 对于每个节点,我们创建一个链表。链表中存储该节点所连接的所有边的信息。 对于每条边,我们在两个节点之间的链表中分别存储该边的信息。例如,如果节点A和节点

    2024年02月02日
    浏览(31)
  • 数据结构——图篇(邻接矩阵、邻接表、深度优先搜索、广度优先搜索)

    描述 图比树更为复杂,展现的是一种多对多的关系,图的结构是任意两个数据对象之间都可能存在某种特定的关系的数据结构 概念 顶点 : 基本介绍 顶点集合表示为V集合,要求图中顶点至少要有一个,即V集合不能为空集。通常使用|V|来表示顶点的个数,通常使用E(V)来表示

    2024年02月04日
    浏览(41)
  • 24考研数据结构-图的存储结构邻接矩阵

    【1】顶点的结点结构 ——————— | data | firstarc | ——————— data数据域:储存顶点vi firstarc链域:指向链表中第一个结点 【2】弧的结点结构 —————————— | adjvex | info | nextarc | —————————— adjvex邻接点域:与顶点vi邻接的点在图中的位置 info数据域

    2024年02月14日
    浏览(57)
  • 数据结构--图的存储邻接表法

    邻接矩阵: 数组实现的顺序存储,空间复杂度高,不适合存储稀疏图 邻接表: 顺序+链式存储 无向图: 边结点的数量是 2|E|, 整体空间复杂度为 O(|V| + 2|E|) 有向图: 边结点的数量是 |E|, 整体空间复杂度为 O(|V| + |E|) 图的邻接表表示方式并不唯一 color{red}图的邻接表表示方

    2024年02月16日
    浏览(47)
  • 数据结构-邻接矩阵的创建与遍历

    上篇文章已经介绍了邻接矩阵的具体作用与如果利用邻接矩阵寻找相邻顶点,这次介绍重点为邻接矩阵的创建与两种遍历方式 邻接矩阵的创建 其结构体需要能记录顶点、顶点数、边数及邻接矩阵,即 创建方式则为读入边数、顶点数即各边的两个顶点和权值 图的遍历 DFS(深

    2024年02月20日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包