1. //_DataStructure_C_Impl:邻接矩阵
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. typedef char VertexType[4];
  6. typedef char InfoPtr;
  7. typedef int VRType;
  8. #define INFINITY 10000 //定义一个无限大的值
  9. #define MaxSize 50 //最大顶点个数
  10. typedef enum{DG,DN,UG,UN}GraphKind; //图的类型:有向图、有向网、无向图和无向网
  11.  
  12. typedef struct{
  13. VRType adj; //对于无权图,用1表示相邻,0表示不相邻。对于带权图,存储权值
  14. InfoPtr *info; //与弧或边的相关信息
  15. }ArcNode,AdjMatrix[MaxSize][MaxSize];
  16. //图的类型定义
  17. typedef struct{
  18. VertexType vex[MaxSize]; //用于存储顶点
  19. AdjMatrix arc; //邻接矩阵,存储边或弧的信息
  20. int vexnum,arcnum; //顶点数和边(弧)的数目
  21. GraphKind kind; //图的类型
  22. }MGraph;
  23. //在顶点向量中查找顶点v。找到返回在向量的序号。否则返回-1
  24. int LocateVertex(MGraph N,VertexType v){
  25. int i;
  26. for(i=0;i<N.vexnum;++i)
  27. if(strcmp(N.vex[i],v)==0)
  28. return i;
  29. return -1;
  30. }
  31. //採用邻接矩阵表示法创建有向网N
  32. void CreateGraph(MGraph *N){
  33. int i,j,k,w,InfoFlag,len;
  34. char s[MaxSize];
  35. VertexType v1,v2;
  36. printf("请输入有向网N的顶点数,弧数,弧的信息(是:1,否:0): ");
  37. scanf("%d,%d,%d",&(*N).vexnum,&(*N).arcnum,&InfoFlag);
  38. printf("请输入%d个顶点的值(<%d个字符):\n",N->vexnum,MaxSize);
  39. for(i=0;i<N->vexnum;++i) //保存网的各个顶点
  40. scanf("%s",N->vex[i]);
  41. for(i=0;i<N->vexnum;i++) //初始化邻接矩阵
  42. for(j=0;j<N->vexnum;j++){
  43. N->arc[i][j].adj=INFINITY;
  44. N->arc[i][j].info=NULL; //弧的信息初始化为空
  45. }
  46. printf("请输入%d条弧的弧尾 弧头 权值(以空格作为间隔): \n",N->arcnum);
  47. for(k=0;k<N->arcnum;k++){
  48. scanf("%s%s%d",v1,v2,&w); //输入两个顶点和弧的权值
  49. i=LocateVertex(*N,v1);
  50. j=LocateVertex(*N,v2);
  51. N->arc[i][j].adj=w;
  52. if(InfoFlag){ //假设弧包括其他信息
  53. printf("请输入弧的相关信息: ");
  54. gets(s);
  55. len=strlen(s);
  56. if(len){
  57. N->arc[i][j].info=(char *)malloc((len+1)*sizeof(char));
  58. strcpy(N->arc[i][j].info,s);
  59. }
  60. }
  61. }
  62. N->kind=DN; //图的类型为有向网
  63. }
  64. //销毁网N
  65. void DestroyGraph(MGraph *N){
  66. int i,j;
  67. for(i=0;i<N->vexnum;i++) //释放弧的相关信息
  68. for(j=0;j<N->vexnum;j++)
  69. if(N->arc[i][j].adj!=INFINITY) //假设存在弧
  70. if(N->arc[i][j].info!=NULL){ //假设弧有相关信息,释放该信息所占用空间
  71. free(N->arc[i][j].info);
  72. N->arc[i][j].info=NULL;
  73. }
  74. N->vexnum=0; //将网的顶点数置为0
  75. N->arcnum=0; //将网的弧的数目置为0
  76. }
  77. //
  78. void DisplayGraph(MGraph N){
  79. int i,j;
  80. printf("有向网具有%d个顶点%d条弧。顶点依次是: ",N.vexnum,N.arcnum);
  81. for(i=0;i<N.vexnum;++i) //输出网的顶点
  82. printf("%s ",N.vex[i]);
  83. printf("\n有向网N的:\n"); //输出网N的弧
  84. printf("序号i=");
  85. for(i=0;i<N.vexnum;i++)
  86. printf("%8d",i);
  87. printf("\n");
  88. for(i=0;i<N.vexnum;i++)
  89. {
  90. printf("%8d",i);
  91. for(j=0;j<N.vexnum;j++)
  92. printf("%8d",N.arc[i][j].adj);
  93. printf("\n");
  94. }
  95. }
  96. void main(){
  97. MGraph N;
  98. printf("创建一个网:\n");
  99. CreateGraph(&N);
  100. printf("输出网的顶点和弧:\n");
  101. DisplayGraph(N);
  102. printf("销毁网:\n");
  103. DestroyGraph(&N);
  104. system("pause");
  105. }

_DataStructure_C_Impl:图的邻接矩阵存储的更多相关文章

  1. 图的邻接矩阵存储实现,C++描述

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  2. java 图的邻接矩阵

    有向图 在有向图中,结点对<x ,y>是有序的,结点对<x,y>称为从结点x到结点y的一条有向边,因此,<x,y>与<y,x>是两条不同的边.有向图中的 ...

  3. PTA 邻接矩阵存储图的深度优先遍历

    6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)( ...

  4. 数据结构C++实现邻接矩阵存储图

    定义邻接矩阵存储的图类.[实验要求] 1. 创建一个邻接矩阵存储的图: 2. 返回图中指定边的权值: 3. 查找图中某顶点的第一个邻接顶点.某顶点关于另一个顶点的下一个邻接顶点序号: 4. 图的深度优 ...

  5. 数据结构(12) -- 图的邻接矩阵的DFS和BFS

    //////////////////////////////////////////////////////// //图的邻接矩阵的DFS和BFS ////////////////////////// ...

  6. Java图的邻接矩阵实现

    /** * * 图的邻接矩阵实现 * @author John * * @param <T> */ class AMWGraph<T> { private ArrayList& ...

  7. 算法与数据结构(四) 图的物理存储结构与深搜、广搜(Swift版)

    开门见山,本篇博客就介绍图相关的东西.图其实就是树结构的升级版.上篇博客我们聊了树的一种,在后边的博客中我们还会介绍其他类型的树,比如红黑树,B树等等,以及这些树结构的应用.本篇博客我们就讲图的存储结 ...

  8. E1_1 用邻接矩阵存储有向图,并输出各顶点的出度和入度

    参考书:图论算法理论.实现及应用(北京大学出版社) 输入数据:(test.txt) 程序: /* 邻接矩阵存储有向图 */ #include <cstring> #include < ...

  9. 图的邻接矩阵实现(c)

    参考:算法:c语言实现 一书 图的邻接矩阵实现 #ifndef GRAPH #define GRAPH /* 图的邻接矩阵实现 */ #include<stdio.h> #include& ...

随机推荐

  1. QT:QObject 简单介绍

    QObject 是所有Qt对象的基类. QObject 是Qt模块的核心.它的最主要特征是关于对象间无缝通信的机制:信号与槽.使用connect()建立信号到槽的连接,使用disconnect()销毁 ...

  2. C++头文件的工作原理

    一.C++编译模式通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称作C++头文件,里面放的也是C+ ...

  3. ThinkPHP使用memcache缓存服务器

    (1)Thinkphp的默认缓存方式是以File方式,在/Runtime/Temp 下生成了好多缓存文件. 服务器装了memcached后想给更改成memecache方式 在Conf/config.p ...

  4. linux计算文件大小

  5. 实验四 使用ASP.NET内置对象 总结

    这次实验内容是ASP.NET的一些内置对象的熟悉,感觉看到了上学期JSP的影子,很多地方都很像.像Response对象,Request对象,Context对象等等.以前我老是搞混Response对象和 ...

  6. yizhihx ubuntu config

    install shadowsocks:http://www.cnblogs.com/huangshiyu13/p/8973967.html download: https://pan.baidu.c ...

  7. selenium+java+chrome环境搭建

    我只能说因为版本冲突,简直太折腾了,而搜了无数个博友的帖子才找到正确条案,就不能好好的写篇文章吗? 最近真的是太闲太闲了,平时没事总得搞点技术,不然心里感觉好空虚, 最近看上了selenium,所以试 ...

  8. java.lang.IllegalArgumentException: Request header is too large 解决方案

    错误描述: java.lang.IllegalArgumentException: Request header is too large 问题分析: 请求头超过了tomcat的限值.本来post请求 ...

  9. 在Android平台下搭建PhoneGap开发环境--用HTML5开发游戏

    一.在Android平台下搭建PhoneGap开发环境具体怎么搭建我这里就不详细说了,如有需要我后面再讲 . PhoneGap 官方地址有详细说明:http://www.phonegap.com. 在 ...

  10. php的MCRYPT_RIJNDAEL_256 和mcrypt_encrypt 用法

    <?php $key = "miyao";//密钥 $string="jiami";//需要加密的字符 $d = new d(); //加密 $crypt ...