数据结构——图——存储结构——邻边表
数据结构——图——存储结构——邻边表
邻接表的处理办法
1.图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易地读取顶点信息,更加方便。另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。
2.图中每个顶点v的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点v的边表,有向图则称为顶点v作为弧尾的出边表。
例如图7-4-6所示的就是一个无向图的邻接表结构。
从图中我们知道,顶点表的各个结点由data和 firstedge两个域表示,data是数据域,存储顶点的信息,firstedge是指针域,指向边表的第一个结点,即此顶点的第-一个邻接点。边表结点由adjvex 和 next两个域组成。adjvex是邻接点域,存储某顶点的邻接点在顶点表中的下标,next则存储指向边表中下一个结点的指针。比如v顶点与vo、vz互为邻接点,则在v1的边表中,adjvex 分别为vo的0和v的2。
这样的结构,对于我们要获得图的相关信息也是很方便的。比如我们要想知道某个顶点的度,就去查找这个顶点的边表中结点的个数。若要判断顶点v到v是否存在边,只需要测试顶点v的边表中 adjvex是否存在结点v的下标j就行了。若求顶点的所有邻接点,其实就是对此顶点的边表进行遍历,得到的 adjvex 域对应的顶点就是邻.接点。
若是有向图,邻接表结构是类似的,比如图7-4-7中第一幅图的邻接表就是第二幅图。但要注意的是有向图由于有方向,我们是以顶点为弧尾来存储边表的,这样很容易就可以得到每个顶点的出度。但也有时为了便于确定顶点的入度或以顶点为弧头的弧,我们可以建立一个有向图的逆邻接表,即对每个顶点v都建立一个链接为v为弧头的表。如图7-4-7的第三幅图所示。
此时我们很容易就可以算出某个顶点的入度或出度是多少,判断两顶点是否存在弧也很容易实现。
对于带权值的网图,可以在边表结点定义中再增加一个weight的数据域,存储权值信息即可,如图7-4-8所示。
有了这些结构的图,下面关于结点定义的代码就很好理解了。
#define MAXVEX 100 /*最大顶点数,应由用户定义*/
typedef char VertexType; /*顶点类型应由用户定义*/typedef int EdgeType; /*边上的权值类型应由用户定义*/typedef struct EdgeNode /*边表结点*/
{int adjvex; /*邻接点域,存储该顶点对应的下标*/EdgeType weight; /*用于存储权值,对于非网图可以不需要*/struct EdgeNode* next; /*链域,指向下一个邻接点*/
} EdgeNode;typedef struct vertexNode/*顶点表结点*/
{VertexType data; /*顶点域,存储顶点信息*/EdgeNode* firstedge; /*边表头指针*/}vertexNode, AdjList[MAXVEX];typedef struct
{AdjList adjList;int numvertexes, numEdges;/*图中当前顶点数和边数*/} GraphAdjList;
对于邻接表的创建,也就是顺理成章之事。无向图的邻接表创建代码如下。
/*建立图的邻接表结构*/
void CreateALGraph(GraphAdjList* G)
{int i, j, k;EdgeNode* e;printf("输入顶点数和边数:\n");scanf("%d,%d", &G->numvertexes, &G->numEdges);/*输入顶点数和边数*/for (i=0;i<G->numvertexes;i++) /*读入顶点信息,建立顶点表*/{scanf(&G->adjList[i].data); /*输入顶点信息*/G->adjList[i].firstedge = NULL; /*将边表置为空表*/}for (k=0;k<G->numEdges;k++) /*建立边表*/{printf("输入(Vi,Vj)上的顶点序号:\n");scanf("%d, %d",&i,&j);/*输入边(vi,v3)上的顶点序号*/e = (EdgeNode*)malloc(sizeof(EdgeNode)); /*向内存申请空间*//*生成边表结点*/e->adjvex = j; /*邻接序号为j*/e->next = G->adjList[i].firstedge; /*将e指针指向当前顶点指向的结点*/G->adjList[i].firstedge=e;/*将当前顶点的指针指向e*/e = (EdgeNode*)malloc(sizeof(EdgeNode)); /*向内存申请空间*//*生成边表结点*/e->adjvex = i; /*邻接序号为i*/e->next = G->adjList[i].firstedge; /*将e指针指向当前顶点指向的结点*/G->adjList[i].firstedge = e;/*将当前顶点的指针指向e*/}
}
由于对于无向图,一条边对应都是两个顶点,所以在循环中,一次就针对i和j分别进行了插入。本算法的时间复杂度,对于n个顶点e条边来说,很容易得出是O(n+e)。
数据结构——图——存储结构——邻边表相关推荐
- 数据结构——图——存储结构——邻边矩阵
数据结构--图--存储结构--邻边矩阵 考虑到图是由顶点和边或弧两部分组成.合在一起比较困难,那就很自然地考虑到分两个结构来分别存储.顶点不分大小.主次,所以用一个一维数组来存储是很不错的选择.而边或 ...
- 图 - 存储结构之邻接表
对于图来说,邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的.因此我们考虑另外一种存储结构方式:邻接表(Adjacency List),即 ...
- 图的存储结构——邻接表法
图的存储结构--邻接表法 一.邻接表 由顶点表和边表构成,顶点表由顶点域(data)和指向第一条邻接边的指针(firstarc)构成,边表(邻接表)结点由邻接点域(adjvex)和指向下一条邻接边 ...
- 数据结构图,图存储结构详解
1. 数据结构的图存储结构 我们知道,数据之间的关系有 3 种,分别是 "一对一"."一对多" 和 "多对多",前两种关系的数据可分别用线性 ...
- 【数据结构与算法】图论基础与图存储结构
前言 由于后续更新好几篇文章都涉及到 图 这种数据结构,因此打算先普及一下 图 的相关理论支持,如果后面的相关内容有些点不太容易理解,可以查阅此篇文章.本文不建议一口气阅读完毕,可以先浏览一遍,在后续 ...
- 7.2图的存储结构(邻接表)
为什么要采用邻接表: 对于边数相对顶点较少的图,这种结构无疑是存储空间的极大浪费. 所以把数组和链表结合起来存储,这种方式在图结构中适用,称为邻接表(AdjacencyList) 邻接表的处理方法如下 ...
- 图很难理解?看这篇图论基础与图存储结构就够了
点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」,购票请扫码咨询 ↑↑↑ 作者 | 程序员吴师兄 转载自五分钟学算法(ID:CXYxiaowu) 1 前言 打算先普及一下图的相关理论支 ...
- pytorch默认初始化_小白学PyTorch | 9 tensor数据结构与存储结构
[机器学习炼丹术]的学习笔记分享<> 小白学PyTorch | 8 实战之MNIST小试牛刀 小白学PyTorch | 7 最新版本torchvision.transforms常用API翻 ...
- Oracle 存储结构_表空间简介
1.什么是表空间 表空间是Oracle 1个虚拟概念,它用于存放数据文件dbf, 也就是说表空间是oracle表数据存放到数据文件的一个中间结构.一般来讲,oracle 一张表(非分 ...
最新文章
- 人工智能落地,商业化比技术更重要
- Linux(Ubuntu)常用命令(二)
- JavaScript实现京东购物车页基础面效果
- 云痕大数据 家长登录_云痕家长app
- 23种设计模式C++实现
- hashmap为什么用红黑树_全网最全,面试常问的HashMap知识点
- 数据库-数据库的常用术语
- Python - Django - 中间件 process_exception
- android 高帧模式,达人分享技巧 手动让安卓机支持王者荣耀高帧率
- 基于Spring Security的认证授权_方法授权_Spring Security OAuth2.0认证授权---springcloud工作笔记133
- 网管教程+从入门到精通软件篇
- iptables中SNAT、DNAT和MASQUERADE的含义【转】
- UML学习_1_模型
- 最好的跑步耳机推荐、盘点五款公认最好的跑步耳机
- 任务分配算法c语言程序,程序员算法基础——贪心算法
- chrome浏览器当鼠标碰到超链接的时候会窗口会抖动
- UE4之打开虚拟键盘
- 泰山OFFICE技术讲座:字体属性的上标研究1:上标是什么
- Android模拟点击的四种方式
- 大数据开发中HBase高级特性和rowkey设计分析