邻接矩阵和邻接表之间的相互转化,输出邻接矩阵和邻接表算法实现。

将文件保存为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);
}

图的存储-邻接矩阵和邻接表之间的相互转化相关推荐

  1. 图的存储--邻接矩阵和邻接表(链表实现和用vector实现)

    邻接矩阵: #include<iostream> #include<vector> #include<iomanip> #include<string> ...

  2. 数据结构之图的存储结构:邻接表法

    图的存储结构:邻接表法 产生条件: 邻接表法的定义: 邻接表法的特点: 邻接表法的代码定义: 邻接表法与邻接矩阵法的对比: 产生条件: 当用邻接矩阵存储时:空间复杂度为O(|v|^2),太大 邻接表法 ...

  3. 图的存储结构之邻接表

    什么是邻接表? 邻接表(Adjacency List)是图的一种顺序存储与链式存储结合的存储方法. 对于图G中的每个顶点Vi,将所有邻接于Vi的顶点Vj链成一个单链表,这个单链表就称为顶点Vi的邻接表 ...

  4. 图的存储结构之邻接表(详解)

    之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M.对于稀疏图来说,M要远远小于N2.先上数据,如下. 1 2 3 ...

  5. 图的存储 邻接矩阵+邻接表+链式前向星

    图的存储 - 邻接矩阵 在树的问题中,邻接矩阵是空间.时间的极大浪费. 假设树的结点个数为 N = 100000. 建立邻接矩阵需要空间为 1e5*1e5 但是由于只有 N - 1 条边,所以在邻接矩 ...

  6. 图的两种存储方式---邻接矩阵和邻接表

    图:图是一种数据结构,由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V,E),V表示为顶点的集 合,E表示为边的集合. 首先肯定是要对图进行存储,然后进行一系列的操作,下面对图的两种存储方式邻 ...

  7. 将图的广度优先遍历在邻接矩阵和邻接表存储结构上分别实现_图解:什么是“图”?

    从今天开始,我们开始介绍图的相关算法 什么是"图" 1.背景 作为图的开始,我们先来看一个经典的问题,它被认为是图论的起源. 这个问题是基于一个现实生活中的事例:河中心有两个小岛. ...

  8. 网状结构(图)图的存储(邻接矩阵、邻接表)、图的遍历(深度DFS、广度BFS)、图的最短路径

    图 多对多关系 是一种网状数据结构,图是由非空的顶点集合和一个描述顶点之间关系的集合组成 其定义 Graph = (V, E) V={x | x ∈某个数据对象} E = {<u, v> ...

  9. 图的存储结构(邻接矩阵和邻接表)

    图的存储结构(邻接矩阵和邻接表) 前言: 前面我们学习图的有些定义和术语,对图这个数据结构有了新的见解和认知,让我们理解图结构的知识,今天我们学习图的存储结构,图的存储结构比较多,我们今天主要是学习邻 ...

最新文章

  1. 『追捕盗贼 Tarjan算法』
  2. VIM使用系列:转换文本大小写
  3. struct lnode是什么结构类型_【自考】数据结构第三章,队列,期末不挂科指南,第4篇
  4. SQL 中使用CONVERT转日期格式
  5. [NOIP2016] 天天爱跑步 桶 + DFS
  6. 调度指挥系统解决方案
  7. 比PS更简单好用的自动抠图软件 一键抠图工具
  8. 【JZOJ5882】雪人
  9. 2018 Google 开发者大会.md
  10. 计算机论文英语单词,英语单词
  11. html中用form单选框右侧提示汗字,HTML表单(Forms)解析
  12. 如果微软狠心鸿蒙系统,微软强制用户升级华为鸿蒙系统出来你会放弃windows使用鸿蒙吗...
  13. truffle unbox react报错解决方案(linux)
  14. 消费新品周报 | 奔富发布2019珍藏系列16款葡萄酒;欧乐-B推出AI电动牙刷
  15. 这几个网站的使用技巧,值得反复读,反复练~
  16. 猫眼电影字体反爬-自动处理字体加密
  17. 全网唯一:surfacepro系列用户重启或解锁后蓝牙失灵终极解决方法【绝对有效】
  18. 8.14 早间行情分析和操作建议 昨晚一波多头拉伸后 空头顺势反压
  19. flv格式怎么转换成mp4,一键快速转换视频格式
  20. 区块链技术服务于税收治理的深圳实践

热门文章

  1. 记一个微商城促销方案实现流程图
  2. 计算机毕业论文会计,会计毕业论文6000字
  3. suse linux 11镜像下载,SUSE Linux Enterprise 11 SP3 发布
  4. Java8中Optional的基础使用和实践
  5. PIPO管道通信范列(linux)
  6. [linux小水滴]工具安装与使用
  7. 完美体验 微软WP7智能手机七大功能亮点
  8. npm install 报错 - node篇
  9. 微信气泡主题设置_微信主题! 米老鼠微信主题气泡设置教程方法
  10. Differentially Private Learning with Adaptive Clipping