网站大量收购闲置独家精品文档,联系QQ:2885784924

第7章 数据结构——图.ppt

  1. 1、本文档共99页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章 数据结构——图

第七章 图 7.1 图的定义和术语 7. 2 图的存储方式 对具体的图而言,最好的存储结构不仅依赖于数据的性质,而且也依赖于在这些数据上所实施的操作。恰当地选择存储结构也受到其他一些因素的影响。例如:顶点的数目、度的平均数、有向图还是无向图等等。如果顶点的度数相差很大,按度数最大的顶点设计结点结构很多存储单元的浪费,而若按每个顶点自己的度数设计不同的顶点结构,又带来操作的不便。因此对于图来说,如何对它实现物理存储是个难题,本节介绍以下三种不同的存储结构。 对于有向图的邻接矩阵来说,当vi,vj是该有向图中的一条弧时,A[i,j]=1;否则A[i,j]=0。第i个顶点的出度为矩阵中第i行中“1”的个数;入度为第i列中“1”的个数,并且有向图弧的条数等于矩阵中“1”的个数。 邻接矩阵的性质 (1) 图中各顶点序号确定后,图的邻接矩阵是唯一确定的; (2) 无向图和无向网的邻接矩阵是一个对称矩阵; (3) 无向图邻接矩阵中第i行(或第i列)的非0元素的个数即为第i个顶点的度; (4) 有向图邻接矩阵第i行非0元素个数为第i个顶点的出度,第i列非0元素个数为第i个顶点的入度,第i个顶点的度为第i行与第i列非0元素个数之和; (5) 无向图的边数等于邻接矩阵中非0元素个数之和的一半,有向图的弧数等于邻接矩阵中非0元素个数之和。 需要说明的是邻接矩阵表示法对于以图的顶点为主的运算比较适用。此外,除完全图外,其他图的邻接矩阵有许多零元素,特别是当n值较大,而边数相对完全图的边(n-1)又少得多时,则此矩阵称为“稀疏矩阵”,浪费存储空间。 7.2.2邻接表 邻接表是图的一种链接存储结构。在邻接表表示法中,用一个顺序存储区来存储图中各顶点的数据,并对图中每个顶点vi建立一个单链表(此单链表称之为vi的邻接表),把顶点vi的所有相邻顶点,即其后继顶点的序号链接起来。 邻接表中的每一个结点(边表结点)均包含有两个域:邻接点域和指针域。其中,邻接点域用于存放与顶点vi相邻接的一个顶点的序号;而指针域用于指向下一个边表结点;每个顶点vi除设置存储本身数据外,还设置了个指针域,作为邻接表的表头指针。n个顶点用一维数组表示。 在无向图的邻接表中,顶点vi的每一个边表结点对应于与vi相关联的一条边;而在有向图的邻接表中,vi的每一个边表结点对应于以vi为始点的一条弧,因此也称有向图的邻接表的边表为出边表。 这样,在有向图的邻接表中求第i个顶点的出度很方便,即为第i个出边表中结点的个数,但是如果要求得到第i个顶点的入度则必须遍历整个表。考虑在有向图的邻接表中,将顶点vi的每个边表结点对应于以vi为终点的一条弧,即用边表结点的邻接点域存储邻接到vi的顶点的序号,由此构成的邻接表称为有向图的逆邻接表,逆邻接表有边表称为入边表。这样在逆邻接表中求某顶点的入度与在邻接表中求顶点的出度一样方便。 邻接表与邻接矩阵的关系 (1) 对应于邻接矩阵的每一行有一个线形链接表; (2) 链接表的表头对应着邻接矩阵该行的顶点; (3) 链接表中的每个结点对应着邻接矩阵中该行的一个非零元素; (4) 对于无向图:一个非零元素表示与该行顶点相邻接的另一个顶点; (5) 对于有向图:非零元素则表示该行顶点为起点的一条边的终点。 #define MAXVEX 50 typedef char VertexType;//顶点类型 typedef int EdgeType;//权值 typedef struct EdgeNode //边表结点 { int adjvex; EdgeType info; struct EdgeNode *next; }EdgeNode; typedef struct VertexNode//顶点表结点 { VertexType data; EdgeNode *firstedge; }VertexNode,AdjList[MAXVEX]; typedef struct { AdjList adjList; int numNode,numEdges; }GraphAdjList; void CreateALGraph(GraphAdjList *G) { int i,j,k; EdgeNode *e; printf(输入顶点数和边数:\n); scanf(%d,%d,G-numNodes,G-numEdges); for(i=0;iG-numNodes;i++) { scanf(G-adjList[i].data); G-adjList[i].firstedge=NULL; } for(k=0;kG-num

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档