数据结构——图——存储结构——邻边表

邻接表的处理办法

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)。

数据结构——图——存储结构——邻边表相关推荐

  1. 数据结构——图——存储结构——邻边矩阵

    数据结构--图--存储结构--邻边矩阵 考虑到图是由顶点和边或弧两部分组成.合在一起比较困难,那就很自然地考虑到分两个结构来分别存储.顶点不分大小.主次,所以用一个一维数组来存储是很不错的选择.而边或 ...

  2. 图 - 存储结构之邻接表

    对于图来说,邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的.因此我们考虑另外一种存储结构方式:邻接表(Adjacency List),即 ...

  3. 图的存储结构——邻接表法

    图的存储结构--邻接表法 一.邻接表 ​ 由顶点表和边表构成,顶点表由顶点域(data)和指向第一条邻接边的指针(firstarc)构成,边表(邻接表)结点由邻接点域(adjvex)和指向下一条邻接边 ...

  4. 数据结构图,图存储结构详解

    1. 数据结构的图存储结构 我们知道,数据之间的关系有 3 种,分别是 "一对一"."一对多" 和 "多对多",前两种关系的数据可分别用线性 ...

  5. 【数据结构与算法】图论基础与图存储结构

    前言 由于后续更新好几篇文章都涉及到 图 这种数据结构,因此打算先普及一下 图 的相关理论支持,如果后面的相关内容有些点不太容易理解,可以查阅此篇文章.本文不建议一口气阅读完毕,可以先浏览一遍,在后续 ...

  6. 7.2图的存储结构(邻接表)

    为什么要采用邻接表: 对于边数相对顶点较少的图,这种结构无疑是存储空间的极大浪费. 所以把数组和链表结合起来存储,这种方式在图结构中适用,称为邻接表(AdjacencyList) 邻接表的处理方法如下 ...

  7. 图很难理解?看这篇图论基础与图存储结构就够了

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」,购票请扫码咨询 ↑↑↑ 作者 | 程序员吴师兄 转载自五分钟学算法(ID:CXYxiaowu) 1 前言 打算先普及一下图的相关理论支 ...

  8. pytorch默认初始化_小白学PyTorch | 9 tensor数据结构与存储结构

    [机器学习炼丹术]的学习笔记分享<> 小白学PyTorch | 8 实战之MNIST小试牛刀 小白学PyTorch | 7 最新版本torchvision.transforms常用API翻 ...

  9. Oracle 存储结构_表空间简介

    1.什么是表空间          表空间是Oracle 1个虚拟概念,它用于存放数据文件dbf, 也就是说表空间是oracle表数据存放到数据文件的一个中间结构.一般来讲,oracle 一张表(非分 ...

最新文章

  1. 人工智能落地,商业化比技术更重要
  2. Linux(Ubuntu)常用命令(二)
  3. JavaScript实现京东购物车页基础面效果
  4. 云痕大数据 家长登录_云痕家长app
  5. 23种设计模式C++实现
  6. hashmap为什么用红黑树_全网最全,面试常问的HashMap知识点
  7. 数据库-数据库的常用术语
  8. Python - Django - 中间件 process_exception
  9. android 高帧模式,达人分享技巧 手动让安卓机支持王者荣耀高帧率
  10. 基于Spring Security的认证授权_方法授权_Spring Security OAuth2.0认证授权---springcloud工作笔记133
  11. 网管教程+从入门到精通软件篇
  12. iptables中SNAT、DNAT和MASQUERADE的含义【转】
  13. UML学习_1_模型
  14. 最好的跑步耳机推荐、盘点五款公认最好的跑步耳机
  15. 任务分配算法c语言程序,程序员算法基础——贪心算法
  16. chrome浏览器当鼠标碰到超链接的时候会窗口会抖动
  17. UE4之打开虚拟键盘
  18. 泰山OFFICE技术讲座:字体属性的上标研究1:上标是什么
  19. Android模拟点击的四种方式
  20. 大数据开发中HBase高级特性和rowkey设计分析

热门文章

  1. 内蒙古软件开发电脑公司一览表
  2. Android 监听外部U盘插入
  3. 2021-04-18-记录学习linux
  4. 二十二、Python文件操作
  5. 官宣:纳斯达克与加密货币联姻在即,牛市会提前来临?
  6. 微服务 - 搭建Consul集群服务,Consul配置中心
  7. 网络切片技术缺点_S^2:浅析网络切片
  8. 京东一键式获得商品详情详细教程
  9. Django入门笔记
  10. JS常用函数 大全