图的存储-邻接矩阵和邻接表之间的相互转化
邻接矩阵和邻接表之间的相互转化,输出邻接矩阵和邻接表算法实现。
将文件保存为GraphBasicOperation.cpp文件,具体实现如下:
#include <stdio.h>
#include <malloc.h>
#include "graph.h"
void MatToList(MGraph g,ALGraph *&G)
//将邻接矩阵g转换成邻接表G
{ int i,j;ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph));for (i=0;i<g.n;i++) //给邻接表中所有头节点的指针域置初值G->adjlist[i].firstarc=NULL;for (i=0;i<g.n;i++) //检查邻接矩阵中每个元素for (j=g.n-1;j>=0;j--)if (g.edges[i][j]!=0) //存在一条边{ p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个节点*pp->adjvex=j;p->nextarc=G->adjlist[i].firstarc; //采用头插法插入*pG->adjlist[i].firstarc=p;}G->n=g.n;G->e=g.e;
}
void ListToMat(ALGraph *G,MGraph &g)
//将邻接表G转换成邻接矩阵g
{ int i;ArcNode *p;for (i=0;i<G->n;i++){ p=G->adjlist[i].firstarc;while (p!=NULL){ g.edges[i][p->adjvex]=1;p=p->nextarc;}}g.n=G->n;g.e=G->e;
}
void DispMat(MGraph g)
//输出邻接矩阵g
{int i,j;for (i=0;i<g.n;i++){for (j=0;j<g.n;j++)printf("%3d",g.edges[i][j]);printf("\n");}
}
void DispAdj(ALGraph *G)
//输出邻接表G
{int i;ArcNode *p;for (i=0;i<G->n;i++){p=G->adjlist[i].firstarc;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 A[MAXV][6]={{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.n=6;g.e=10;for (i=0;i<g.n;i++)for (j=0;j<g.n;j++)g.edges[i][j]=A[i][j];printf("\n");printf(" 有向图G的邻接矩阵:\n");DispMat(g);G=(ALGraph *)malloc(sizeof(ALGraph));printf(" 图G的邻接矩阵转换成邻接表:\n");MatToList(g,G);DispAdj(G);printf(" 图G的邻接表转换成邻接邻阵:\n");for (i=0;i<g.n;i++)for (j=0;j<g.n;j++)g1.edges[i][j]=0;ListToMat(G,g1);DispMat(g1);printf("\n");
}
*/
int visited[MAXV]; //全局变量
void DFSTrav(MGraph g,int parent,int child,int &len)
{ int clen,v=0,maxlen;clen=len;maxlen=len;while (v<g.n && g.edges[child][v]==0) //找child的第一个邻接点vv++;while (v<g.n) //存在邻接点时循环{ if (v!=parent){ len=len+g.edges[child][v];DFSTrav(g,child,v,len);if (len>maxlen) maxlen=len;}v++;while (v<g.n && g.edges[child][v]==0)//找child的下一个邻接点v++;len=clen;}len=maxlen;
}
int Diameter(MGraph g,int v)
{ int maxlen1=0; //存放到目前找到根v到叶节点的最大值int maxlen2=0; //存放到目前找到根v到叶节点的次大值int len=0; //记录深度优先遍历中到某个叶节点的距离int w=0; //存放v的邻接顶点while (w<g.n && g.edges[v][w]==0) //找与v相邻的第一个顶点ww++;while (w<g.n) //存在邻接点时循环{ len=g.edges[v][w];DFSTrav(g,v,w,len);if (len>maxlen1){ maxlen2=maxlen1;maxlen1=len;}else if (len>maxlen2)maxlen2=len;w++;while (w<g.n && g.edges[v][w]==0) //找v的下一个邻接点ww++;}return maxlen1+maxlen2;
}void PathAll(ALGraph *G,int u,int v,int path[],int d)
{ArcNode *p;int j,w;visited[u]=1;p=G->adjlist[u].firstarc; //p指向顶点u的第一条边的边头节点while (p!=NULL){ w=p->adjvex; //w为u的邻接顶点if (w==v){ path[d+1]=w;for (j=0;j<=d+1;j++)printf("%2d",path[j]);printf("\n");}else if (visited[w]==0) //若该顶点未标记访问,则递归访问之{ path[d+1]=w;PathAll(G,w,v,path,d+1);}p=p->nextarc; //找u的下一个邻接顶点}visited[u]=0;
}void main()
{ int i,j;int u=0,v=3,path[MAXV];MGraph g;ALGraph *G;int A[MAXV][5]={{0,1,0,1,1},{1,0,1,1,0},{0,1,0,1,1},{1,1,1,0,1},{1,0,1,1,0}};g.n=5;g.e=8;for (i=0;i<g.n;i++) //建立《教程》中图8.1(a)的邻接矩阵for (j=0;j<g.n;j++)g.edges[i][j]=A[i][j];G=(ALGraph *)malloc(sizeof(ALGraph));MatToList(g,G); //生成《教程》中图8.1(a)的邻接表Gprintf("图G的邻接表:\n");DispAdj(G);for (i=0;i<g.n;i++) //访问标识数组置初值0visited[i]=0;printf("从%d到%d的所有简单路径:\n",u,v);path[0]=u;visited[u]=1;PathAll(G,u,v,path,0);
}
图的存储-邻接矩阵和邻接表之间的相互转化相关推荐
- 图的存储--邻接矩阵和邻接表(链表实现和用vector实现)
邻接矩阵: #include<iostream> #include<vector> #include<iomanip> #include<string> ...
- 数据结构之图的存储结构:邻接表法
图的存储结构:邻接表法 产生条件: 邻接表法的定义: 邻接表法的特点: 邻接表法的代码定义: 邻接表法与邻接矩阵法的对比: 产生条件: 当用邻接矩阵存储时:空间复杂度为O(|v|^2),太大 邻接表法 ...
- 图的存储结构之邻接表
什么是邻接表? 邻接表(Adjacency List)是图的一种顺序存储与链式存储结合的存储方法. 对于图G中的每个顶点Vi,将所有邻接于Vi的顶点Vj链成一个单链表,这个单链表就称为顶点Vi的邻接表 ...
- 图的存储结构之邻接表(详解)
之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M.对于稀疏图来说,M要远远小于N2.先上数据,如下. 1 2 3 ...
- 图的存储 邻接矩阵+邻接表+链式前向星
图的存储 - 邻接矩阵 在树的问题中,邻接矩阵是空间.时间的极大浪费. 假设树的结点个数为 N = 100000. 建立邻接矩阵需要空间为 1e5*1e5 但是由于只有 N - 1 条边,所以在邻接矩 ...
- 图的两种存储方式---邻接矩阵和邻接表
图:图是一种数据结构,由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V,E),V表示为顶点的集 合,E表示为边的集合. 首先肯定是要对图进行存储,然后进行一系列的操作,下面对图的两种存储方式邻 ...
- 将图的广度优先遍历在邻接矩阵和邻接表存储结构上分别实现_图解:什么是“图”?
从今天开始,我们开始介绍图的相关算法 什么是"图" 1.背景 作为图的开始,我们先来看一个经典的问题,它被认为是图论的起源. 这个问题是基于一个现实生活中的事例:河中心有两个小岛. ...
- 网状结构(图)图的存储(邻接矩阵、邻接表)、图的遍历(深度DFS、广度BFS)、图的最短路径
图 多对多关系 是一种网状数据结构,图是由非空的顶点集合和一个描述顶点之间关系的集合组成 其定义 Graph = (V, E) V={x | x ∈某个数据对象} E = {<u, v> ...
- 图的存储结构(邻接矩阵和邻接表)
图的存储结构(邻接矩阵和邻接表) 前言: 前面我们学习图的有些定义和术语,对图这个数据结构有了新的见解和认知,让我们理解图结构的知识,今天我们学习图的存储结构,图的存储结构比较多,我们今天主要是学习邻 ...
最新文章
- 『追捕盗贼 Tarjan算法』
- VIM使用系列:转换文本大小写
- struct lnode是什么结构类型_【自考】数据结构第三章,队列,期末不挂科指南,第4篇
- SQL 中使用CONVERT转日期格式
- [NOIP2016] 天天爱跑步 桶 + DFS
- 调度指挥系统解决方案
- 比PS更简单好用的自动抠图软件 一键抠图工具
- 【JZOJ5882】雪人
- 2018 Google 开发者大会.md
- 计算机论文英语单词,英语单词
- html中用form单选框右侧提示汗字,HTML表单(Forms)解析
- 如果微软狠心鸿蒙系统,微软强制用户升级华为鸿蒙系统出来你会放弃windows使用鸿蒙吗...
- truffle unbox react报错解决方案(linux)
- 消费新品周报 | 奔富发布2019珍藏系列16款葡萄酒;欧乐-B推出AI电动牙刷
- 这几个网站的使用技巧,值得反复读,反复练~
- 猫眼电影字体反爬-自动处理字体加密
- 全网唯一:surfacepro系列用户重启或解锁后蓝牙失灵终极解决方法【绝对有效】
- 8.14 早间行情分析和操作建议 昨晚一波多头拉伸后 空头顺势反压
- flv格式怎么转换成mp4,一键快速转换视频格式
- 区块链技术服务于税收治理的深圳实践
热门文章
- 记一个微商城促销方案实现流程图
- 计算机毕业论文会计,会计毕业论文6000字
- suse linux 11镜像下载,SUSE Linux Enterprise 11 SP3 发布
- Java8中Optional的基础使用和实践
- PIPO管道通信范列(linux)
- [linux小水滴]工具安装与使用
- 完美体验 微软WP7智能手机七大功能亮点
- npm install 报错 - node篇
- 微信气泡主题设置_微信主题! 米老鼠微信主题气泡设置教程方法
- Differentially Private Learning with Adaptive Clipping