问题及代码:

main.cpp:

[cpp] view plaincopy
  1. /*
  2. Copyright (c)2016,烟台大学计算机与控制工程学院
  3. All rights reserved.
  4. 文件名称:tu.pp
  5. 作    者:   陈朋
  6. 完成日期:2016年11月24日
  7. 版 本 号:v1.0
  8. 问题描述:
  9. 输入描述:无
  10. 程序输出:若干。
  11. */
  12. #include <stdio.h>
  13. #include <malloc.h>
  14. #include "graph.h"
  15. int main()
  16. {
  17. MGraph g1,g2;
  18. ALGraph *G1,*G2;
  19. int A[6][6]=
  20. {
  21. {0,5,0,7,0,0},
  22. {0,0,4,0,0,0},
  23. {8,0,0,0,0,9},
  24. {0,0,5,0,0,6},
  25. {0,0,0,5,0,0},
  26. {3,0,0,0,1,0}
  27. };
  28. ArrayToMat(A[0], 6, g1);  //取二维数组的起始地址作实参,用A[0],因其实质为一维数组地址,与形参匹配
  29. printf(" 有向图g1的邻接矩阵:\n");
  30. DispMat(g1);
  31. ArrayToList(A[0], 6, G1);
  32. printf(" 有向图G1的邻接表:\n");
  33. DispAdj(G1);
  34. MatToList(g1,G2);
  35. printf(" 图g1的邻接矩阵转换成邻接表G2:\n");
  36. DispAdj(G2);
  37. ListToMat(G1,g2);
  38. printf(" 图G1的邻接表转换成邻接邻阵g2:\n");
  39. DispMat(g2);
  40. printf("\n");
  41. return 0;
  42. }

graph.h

[cpp] view plaincopy
  1. #ifndef GRAPH_H_INCLUDED
  2. #define GRAPH_H_INCLUDED
  3. #define MAXV 100                //最大顶点个数
  4. #define INF 32767       //INF表示∞
  5. typedef int InfoType;
  6. //以下定义邻接矩阵类型
  7. typedef struct
  8. {
  9. int no;                     //顶点编号
  10. InfoType info;              //顶点其他信息,在此存放带权图权值
  11. } VertexType;                   //顶点类型
  12. typedef struct                  //图的定义
  13. {
  14. int edges[MAXV][MAXV];      //邻接矩阵
  15. int n,e;                    //顶点数,弧数
  16. VertexType vexs[MAXV];      //存放顶点信息
  17. } MGraph;                       //图的邻接矩阵类型
  18. //以下定义邻接表类型
  19. typedef struct ANode            //弧的结点结构类型
  20. {
  21. int adjvex;                 //该弧的终点位置
  22. struct ANode *nextarc;      //指向下一条弧的指针
  23. InfoType info;              //该弧的相关信息,这里用于存放权值
  24. } ArcNode;
  25. typedef int Vertex;
  26. typedef struct Vnode            //邻接表头结点的类型
  27. {
  28. Vertex data;                //顶点信息
  29. int count;                  //存放顶点入度,只在拓扑排序中用
  30. ArcNode *firstarc;          //指向第一条弧
  31. } VNode;
  32. typedef VNode AdjList[MAXV];    //AdjList是邻接表类型
  33. typedef struct
  34. {
  35. AdjList adjlist;            //邻接表
  36. int n,e;                    //图中顶点数n和边数e
  37. } ALGraph;                      //图的邻接表类型
  38. //功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
  39. //参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
  40. //      n - 矩阵的阶数
  41. //      g - 要构造出来的邻接矩阵数据结构
  42. void ArrayToMat(int *Arr, int n, MGraph &g); //用普通数组构造图的邻接矩阵
  43. void ArrayToList(int *Arr, int n, ALGraph *&); //用普通数组构造图的邻接表
  44. void MatToList(MGraph g,ALGraph *&G);//将邻接矩阵g转换成邻接表G
  45. void ListToMat(ALGraph *G,MGraph &g);//将邻接表G转换成邻接矩阵g
  46. void DispMat(MGraph g);//输出邻接矩阵g
  47. void DispAdj(ALGraph *G);//输出邻接表G
  48. #endif // GRAPH_H_INCLUDED

graph.cpp

[cpp] view plaincopy
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include "graph.h"
  4. //功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
  5. //参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
  6. //      n - 矩阵的阶数
  7. //      g - 要构造出来的邻接矩阵数据结构
  8. void ArrayToMat(int *Arr, int n, MGraph &g)
  9. {
  10. int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数
  11. g.n=n;
  12. for (i=0; i<g.n; i++)
  13. for (j=0; j<g.n; j++)
  14. {
  15. g.edges[i][j]=Arr[i*n+j]; //将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j],计算存储位置的功夫在此应用
  16. if(g.edges[i][j]!=0 && g.edges[i][j]!=INF)
  17. count++;
  18. }
  19. g.e=count;
  20. }
  21. void ArrayToList(int *Arr, int n, ALGraph *&G)
  22. {
  23. int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数
  24. ArcNode *p;
  25. G=(ALGraph *)malloc(sizeof(ALGraph));
  26. G->n=n;
  27. for (i=0; i<n; i++)                 //给邻接表中所有头节点的指针域置初值
  28. G->adjlist[i].firstarc=NULL;
  29. for (i=0; i<n; i++)                 //检查邻接矩阵中每个元素
  30. for (j=n-1; j>=0; j--)
  31. if (Arr[i*n+j]!=0)      //存在一条边,将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j]
  32. {
  33. p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*p
  34. p->adjvex=j;
  35. p->info=Arr[i*n+j];
  36. p->nextarc=G->adjlist[i].firstarc;      //采用头插法插入*p
  37. G->adjlist[i].firstarc=p;
  38. }
  39. G->e=count;
  40. }
  41. void MatToList(MGraph g, ALGraph *&G)
  42. //将邻接矩阵g转换成邻接表G
  43. {
  44. int i,j;
  45. ArcNode *p;
  46. G=(ALGraph *)malloc(sizeof(ALGraph));
  47. for (i=0; i<g.n; i++)                   //给邻接表中所有头节点的指针域置初值
  48. G->adjlist[i].firstarc=NULL;
  49. for (i=0; i<g.n; i++)                   //检查邻接矩阵中每个元素
  50. for (j=g.n-1; j>=0; j--)
  51. if (g.edges[i][j]!=0)       //存在一条边
  52. {
  53. p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*p
  54. p->adjvex=j;
  55. p->info=g.edges[i][j];
  56. p->nextarc=G->adjlist[i].firstarc;      //采用头插法插入*p
  57. G->adjlist[i].firstarc=p;
  58. }
  59. G->n=g.n;
  60. G->e=g.e;
  61. }
  62. void ListToMat(ALGraph *G,MGraph &g)
  63. //将邻接表G转换成邻接矩阵g
  64. {
  65. int i,j;
  66. ArcNode *p;
  67. g.n=G->n;   //根据一楼同学“举报”改的。g.n未赋值,下面的初始化不起作用
  68. g.e=G->e;
  69. for (i=0; i<g.n; i++)   //先初始化邻接矩阵
  70. for (j=0; j<g.n; j++)
  71. g.edges[i][j]=0;
  72. for (i=0; i<G->n; i++)  //根据邻接表,为邻接矩阵赋值
  73. {
  74. p=G->adjlist[i].firstarc;
  75. while (p!=NULL)
  76. {
  77. g.edges[i][p->adjvex]=p->info;
  78. p=p->nextarc;
  79. }
  80. }
  81. }
  82. void DispMat(MGraph g)
  83. //输出邻接矩阵g
  84. {
  85. int i,j;
  86. for (i=0; i<g.n; i++)
  87. {
  88. for (j=0; j<g.n; j++)
  89. if (g.edges[i][j]==INF)
  90. printf("%3s","∞");
  91. else
  92. printf("%3d",g.edges[i][j]);
  93. printf("\n");
  94. }
  95. }
  96. void DispAdj(ALGraph *G)
  97. //输出邻接表G
  98. {
  99. int i;
  100. ArcNode *p;
  101. for (i=0; i<G->n; i++)
  102. {
  103. p=G->adjlist[i].firstarc;
  104. printf("%3d: ",i);
  105. while (p!=NULL)
  106. {
  107. printf("-->%d/%d ",p->adjvex,p->info);
  108. p=p->nextarc;
  109. }
  110. printf("\n");
  111. }
  112. }
  113. 运行结果:

第十二周 项目一--图基本算法库相关推荐

  1. 第十二周项目一----图基本算法库

    /*烟台大学计算机与控制工程学院 作者:孙潇 时间:2015年11月13日 问题描述:定义图的邻接矩阵和邻接表存储结构,实现其基本运算,并完成测试. 输入描述:无 输出描述:若干数据 */ 头文件: ...

  2. 数据结构上机实践第11周项目1 - 图基本算法库

    图基本算法库   本次实践将建立图的基本算法库,用以丰富算法库,灵活应对更多样的工程,所谓"技多不压身",算法亦如此.   本次实践将运用多文件组织工程的建立,点击此处参考.(编译 ...

  3. 第十二周项目4-利用遍历思想求解图问题(6-7)

    /* Copyright (c)2015,烟台大学计算机与控制工程学院 All rights reserved. 文件名称:第十二周项目4-利用遍历思想求解图问题(6-7) 作 者:佟兴锋 完成日期: ...

  4. 第十二周项目二----操作用邻接表存储的图

    /*烟台大学计算机与控制工程学院 时间2015年12月14日 作者:孙潇 问题描述:假设图G采用邻接表存储,分别设计实现以下要求的算法: (1)输出出图G中每个顶点的出度: (2)求出图G中出度最大的 ...

  5. 数据结构上机实践第11周项目3 - 图遍历算法实现

    图遍历算法实现 本次实践将运用图结构基本算法库,进行遍历操作的实现,本次实践到的算法库点击此处参考.(编译环境:VC++6.0) 1.深度优先遍历--DFS 测试用图: 测试时用的图是,可以使用其他类 ...

  6. 数据结构上机实践第八周项目9-广义表算法库及应用

    广义表算法库及应用 为了丰富算法库,以应对各类工程的需要,本次实践将进行广义表算法库的建立以及应用. 项目要求一: 建立广义表算法库,包括:  ① 头文glist.h,定义数据类型,声明函数:  ② ...

  7. 第十二周项目五-----迷宫问题之图深度优先遍历解法

     烟台大学计算机与控制工程学院 作者:孙潇 时间:2015年12月15日 问题描述:[项目 - 迷宫问题之图深度优先遍历解法]   设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题.   ( ...

  8. 第十二周项目5-迷宫问题之图深度优先遍历解法

    问题: /* * Copyright(c)2015,烟台大学计算机学院 * All right reserved. * 文件名称:项目5.cbp * 作者:李艺 * 完成日期:2015年11月20日 ...

  9. 第十二周项目四----利用遍历思想求解图问题之6最短路径

    /*烟台大学计算机与控制工程学院 时间2015年12月14日 作者:孙潇 问题描述:假设图G采用邻接表存储,分别设计实现以下要求的算法,要求用区别于示例中的图进行多次测试,通过观察输出值,掌握相关问题 ...

  10. 第十二周项目四----利用遍历思想求解图问题之7最远顶点

    /*烟台大学计算机与控制工程学院 时间2015年12月14日 作者:孙潇 问题描述:假设图G采用邻接表存储,分别设计实现以下要求的算法,要求用区别于示例中的图进行多次测试,通过观察输出值,掌握相关问题 ...

最新文章

  1. mongodb常用命令
  2. PS怎么将自己的形状存储为自定形状?
  3. 中间层体系结构的好处
  4. 一个可以显示具体时间的日历控件应用
  5. 安装windows 2003 R2额外域控制器时出现1168错误的解决
  6. 西数加密linux,Symantec PGP Desktop pgpwded.sys内核驱动任意代码执行漏洞
  7. 深度学习模型可解释性初探
  8. 使用IntelliJ IDEA配置Tomcat(入门)
  9. matlab中的变换器,buck变换器介绍_buck变换器matlab仿真
  10. 请不要 “妖魔化” 外包
  11. STM32中的IDR和ODR寄存器
  12. 【数据库】imp-00015
  13. c语言实现个人财务管理软件
  14. What is Scala
  15. C语言连接mysql数据库详细步骤
  16. Nandflash存储结构和地址分配
  17. WAS 中 IHS 配置参考,值的学习一下!
  18. 手机上安装Linux游戏模拟器,Linux系统上安装ePSXe 1.6.0游戏模拟器
  19. 星号表达式(starred expression)或在列表前面加星号(*)的作用
  20. java性别_java中的性别字段

热门文章

  1. MDK-ARM_V525新建工程 STM32使用软件仿真、RAM仿真调试及Flash下载配置详解
  2. Next.js中通过容联云通讯实现手机验证码收发
  3. cwRsync同步工具的使用
  4. 软件的界面测试是什么?怎么设计的?
  5. ps计算机设置在哪,在哪里设置PS对称渐变工具
  6. Elasticsearch 7.13 删除文档后如何释放存储空间、手动执行forcemerge操作
  7. 计算机专业的有关的外文文献,计算机专业外文外文 计算机专业专著类参考文献有哪些...
  8. 你了解PowerBI中的去年同期吗
  9. aws linux vps使用教程,亚马逊云(AWS)注册账号和启动服务器EC2(centos镜像)教程(踩坑记)...
  10. 页面自动添加font标签