前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >邻接表

邻接表

作者头像
大忽悠爱学习
发布2021-03-23 12:08:01
6250
发布2021-03-23 12:08:01
举报
文章被收录于专栏:c++与qt学习

邻接矩阵缺点:

邻接矩阵是不错的存储结构,但是我们发现,对于边数相对于顶点较少的图,这种结构是存在对存储空间的极大浪费的

因此在处理稀疏图时,可以采用下面将要介绍的邻接表

无向图的邻接表

有向图的邻接表

网图的邻接表

邻接表存储有向图的类

有向图邻接表的构造函数初始化操作

邻接表的构造函数和输出函数代码实现

代码语言:javascript
复制
#include<iostream>
using namespace std;
//邻接链表
typedef char DataType; //顶点的数据类型
//边表结构体
struct ArcNode 
{
	int dajvex;//记录邻接点在数组中的下标
	ArcNode* next;
};
//顶点表结构体
struct VertexNode 
{
	DataType vertex;//顶点结构体的数据
	ArcNode* firstEdge;//相当于头指针,指向边表
};
const int MAX = 10; //图的最大顶点数
class Graph 
{
private:
	VertexNode adjList[MAX];//顶点表结构体数组
	int vertexNum;//顶点数
	int arcNum;//边数
public:
	Graph(DataType v[], int n, int e);
	void display();
};
//构造函数实现:用户传入的顶点结构体数组,里面存放着顶点数据  顶点数  边数
Graph::Graph(DataType v[], int n, int e) 
{
	vertexNum = n;//初始化顶点数
	arcNum = e;//初始化边数
	for (int i = 0; i < vertexNum; i++)
	{
		adjList[i].vertex = v[i]; //将用户传入的顶点数据给顶点结构体数组进行赋值
		adjList[i].firstEdge = NULL;
	}
	//建立边的关系
	for (int i = 0; i < arcNum; i++)
	{
		//输入边的信息存储在边表中
		int vi, vj;                              
		cin >> vi >> vj;//输入边依附两个顶点的编号
		ArcNode* s = new ArcNode;//将边表结构体开辟在堆区
		s->dajvex = vj;//这里是有向图,所以vi--->vj,dajvex存储的值是出度节点在数组中的下标
		//头插法
		s->next = adjList[vi].firstEdge;
		adjList[vi].firstEdge = s;
	}
}
//测试----------------
void Graph::display()
{
	for (int i = 0; i < vertexNum; i++)
	{
		cout << adjList[i].vertex << " ";
		ArcNode* workNode = adjList[i].firstEdge;
		while (workNode)
		{
			workNode = workNode->next;
			cout << workNode->dajvex <<" ";
		}
		cout << "================" << endl;
	}
}
int main()
{
	DataType v[4] = { 'v0','v1','v2','v3' };
	Graph p(v,4,4);
	p.display();
	system("pause");
	return 0;

因为邻接表来查询某个顶点的入度非常繁琐,因此为了解决查找入度麻烦的问题,引出了逆邻接表

因为一个图用两个表来表示,占据存储空间很大,因此我们需要将这两个表合并在一起,就诞生了一种新的存储方式

十字链表----有向图

firstin---->指向入边节点—>指向边链表中当前当前顶点作为入度节点的节点----->相当于逆邻接链表

firstout—>指向出边节点----->指向边链表中当前节点作为初度节点的节点—>相当于邻接链表

tailvex—>记录指向当前边链表的头指针所在顶点结构体中顶点的下标

headvex---->记录当前顶点的出度节点的下标

taillink—>指向当前顶点的出度节点

headlink—>指向当前顶点的入度节点

十字链表来表示上图

v0有两个入边,所以在vo的firstin指向v1后,v1的headlink指向v2,v2后再无v0的入边,所以其taillink为空

邻接多重表—解决无向图中边存储两次的重复问题

邻接矩阵和邻接表性能比较

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 邻接矩阵缺点:
  • 因此在处理稀疏图时,可以采用下面将要介绍的邻接表
  • 无向图的邻接表
  • 有向图的邻接表
  • 网图的邻接表
  • 邻接表存储有向图的类
  • 有向图邻接表的构造函数初始化操作
  • 邻接表的构造函数和输出函数代码实现
  • 因为邻接表来查询某个顶点的入度非常繁琐,因此为了解决查找入度麻烦的问题,引出了逆邻接表
  • 十字链表----有向图
  • firstin---->指向入边节点—>指向边链表中当前当前顶点作为入度节点的节点----->相当于逆邻接链表
  • firstout—>指向出边节点----->指向边链表中当前节点作为初度节点的节点—>相当于邻接链表
  • tailvex—>记录指向当前边链表的头指针所在顶点结构体中顶点的下标
  • headvex---->记录当前顶点的出度节点的下标
  • taillink—>指向当前顶点的出度节点
  • headlink—>指向当前顶点的入度节点
  • 十字链表来表示上图
  • 邻接多重表—解决无向图中边存储两次的重复问题
  • 邻接矩阵和邻接表性能比较
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档