收藏 分享(赏)

图的邻接矩阵和邻接表相互转换.doc

上传人:dcs1276 文档编号:7704131 上传时间:2019-05-24 格式:DOC 页数:10 大小:65.50KB
下载 相关 举报
图的邻接矩阵和邻接表相互转换.doc_第1页
第1页 / 共10页
图的邻接矩阵和邻接表相互转换.doc_第2页
第2页 / 共10页
图的邻接矩阵和邻接表相互转换.doc_第3页
第3页 / 共10页
图的邻接矩阵和邻接表相互转换.doc_第4页
第4页 / 共10页
图的邻接矩阵和邻接表相互转换.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、图的邻接矩阵和邻接表相互转换图的邻接矩阵存储方法具有如下几个特征:1)无向图的邻接矩阵一定是一个对称矩阵。2)对于无向图的 邻接矩阵的第 i 行非零元素的个数正好是第 i 个顶点的度 。3)对于ivTD有向图,邻接矩阵的第 i 行非零元素的个数正好是第 i 个顶点的出度 (或入度 )iOiI。4)用邻接矩阵 方法存储图,很容易确定 图中任意两个顶 点之间是否有边相连;但是,要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所发费得时间代价大。邻接表是图的一种顺序存储与链式存储相结合的存储方法。若无向图中有 n 个顶点、 e条边, 则它的邻接表需 n 个头结点和 2e 个表结点。显然,在

2、边稀疏的情况下,用 邻接表表示图比邻接矩阵存储空间。在无向 图的邻接表中, 顶点 的度恰好是第 i 个链表中的结点数,iv而在有向图中,第 i 个链表中结点个数是顶点 的出度。i在建立邻接表或邻逆接表时,若 输入的顶点信息即为顶点的 编号, 则建立临接表的时间复杂度是 ;否则,需要通 过查找才能得到顶点在图 中位置, 则时间复杂度为)(enO。在邻接表上容易找到任意一 顶点的第一个邻接点和下一个 邻接点,但要判断任意)*两个顶点之间是否有边或弧, 则需要搜索第 i 个或第 j 个链表,因此,不及邻接矩阵方便。邻接矩阵和邻接表相互转换程序代码如下:#include#define MAX 20/图

3、的邻接表存储表示typedef struct ArcNodeint adjvex; /弧的邻接定点char info; /邻接点 值struct ArcNode *nextarc; /指向下一条弧的指针ArcNode;typedef struct Vnode /节点信息char data;ArcNode *link;Vnode,AdjListMAX;typedef struct AdjList vertices; int vexnum; /节点数int arcnum; /边数ALGraph;/图的邻接矩阵存储表示typedef structint n; /顶点个数char vexsMAX; /

4、定点信息int arcsMAXMAX; /边信息矩阵AdjMatrix;/*_*/函数名:AdjListToMatrix(AdjList g1,AdjListMatrix ArcNode *p;gm.n=gl.vexnum;for(k=0;kadjvex=1;p=p-nextarc;/*_*/函数名:AdjMatrixToAdjListvoid AdjMatrixToAdjList(AdjMatrix gm,ALGraph ArcNode *p;k=0;gl.vexnum=gm.n;coutchoice;for(i=0;iadjvex=j;p-info=gm.vexsj;p-nextarc=g

5、l.verticesi.link;gl.verticesi.link=p;if(choice=1)k=k/2;gl.arcnum=k;void CreateAdjList(ALGraph ArcNode *p;coutchoice;coutG.vexnumG.arcnum;for(i=0;iG.verticesi.data;G.verticesi.link=NULL;if(choice=1)for(i=0;isd;p=new ArcNode;p-adjvex=d;p-info=G.verticesd.data;p-nextarc=G.verticess.link;G.verticess.lin

6、k=p;elsefor(i=0;isd;p=new ArcNode;p-adjvex=d;p-info=G.verticesd.data;p-nextarc=G.verticess.link;G.verticess.link=p;void CreateAdjMatrix(AdjMatrix coutM.n;coutM.vexsk;coutchoice;coutij;M.arcsij=M.arcsji=1;break;case 2:for(k=0;kij;M.arcsij=1;break;void OutPutAdjList(ALGraph ArcNode *p;cout(“adjvexinfo

7、nextarc;cout#includetypedef int InfoType;#define MAXV 100typedef structint no;InfoType info;VertexType;typedef structint edgesMAXVMAXV;int vexnum,arcnum;VertexType vexsMAXV;MGraph;typedef struct ANodeint adjvex;struct ANode *nextarc;InfoType info;ArcNode;typedef int Vertex;typedef struct VnodeVertex

8、 data;ArcNode *firstarc;VNode;typedef VNode AdjListMAXV;typedef structAdjList adjlist;int n,e;ALGraph;#define INF 32767/邻接矩阵 g转换为邻接表 Gvoid MatToList(MGraph g,ALGraph *ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph);for(i=0;iadjlisti.firstarc=NULL;for(i=0;i=0;j-)if(g.edgesij!=0)p=(ArcNode *)malloc(siz

9、eof(ArcNode);p-adjvex=j;p-info=g.edgesij;p-nextarc=G-adjlisti.firstarc;G-adjlisti.firstarc=p;G-n=n;G-e=g.arcnum;/邻接表 G转换为邻接矩阵 gvoid ListToMat(ALGraph *G,MGraph ArcNode *p;for(i=0;iadjlisti.firstarc;while(p!=NULL)g.edgesip-adjvex=p-info;p=p-nextarc;g.vexnum=n;g.arcnum=G-e;/输出邻接矩阵void DispMat(MGraph g

10、)int i,j;for(i=0;in;i+)p=G-adjlisti.firstarc;if(p!=NULL)printf(“%3d:“,i);while(p!=NULL)printf(“%3d“,p-adjvex);p=p-nextarc;printf(“n“);void main()int i,j;MGraph g,g1;ALGraph *G;int AMAXV6=0,5,0,7,0,0,0,0,4,0,0,0,8,0,0,0,0,9,0,0,5,0,0,6,0,0,0,5,0,0,3,0,0,0,1,0;g.vexnum=6;g.arcnum=10;for(i=0;ig.vexnum;i+)for(j=0;jg.vexnum;j+)g.edgesij=Aij;printf(“n“);DispMat(g);G=(ALGraph *)malloc(sizeof(ALGraph);printf(“图 G的邻接图矩阵转换成邻接表:n“);MatToList(g,G);DispAdj(G);printf(“图 g的邻接表转换成邻接矩阵 G:n“);ListToMat(G,g1);DispMat(g1);printf(“n“);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报