使用邻接矩阵实现的图结构

使用邻接矩阵实现的图结构
下一次实验课就要逼近了,我也不能坐以待毙,所以要积极起来呢。前几天就是在研究这个图结构是怎样实现的,看了很多的书,然后一知半解地照着书进行模仿。总觉得自己的思维局限在书中了,没有很好地发散。没有办法,因为考试是要考你掌握了知识没有,它是拒绝你创新的想法的。这真是考试的悲哀啊。
扯远了,我将书上的伪代码转化成了C++代码,保证能运行,但是这是看到的。有什么办法呢?有!不过有些麻烦。第一是在我的代码中加上cout语句,将所有顶点和弧的值输出,这样就可以看到输入的数值是否成功。第二种方法是在我的JGraph.h下设置断点,让程序停下来,然后在参数列表中搜索各个数组的值是否已经存入。使用邻接矩阵的话,只需要检查vexs数组和AdjMatrix二维数组的值是否存入即可。在我的代码中有提示。

更新于2010年12月8日:这是我最近,也是最新的成果,大家可以看看:http://student.youkuaiyun.com/space.php?uid=999749&do=blog&id=51393

Code:
  1. 下面是我的JGraph.h代码:
  2. /*----------------------------------------------------------------------------
  3. 蒋轶民制作:E-mail:jiangcaiyang123@163.com
  4. ------------------------------------------------------------------------------
  5. 文件名:JGraph.h
  6. ------------------------------------------------------------------------------
  7. 作用:这是使用邻接矩阵制作的图状结构,基本实现了图的创建操作。
  8. ------------------------------------------------------------------------------
  9. 调用规范:无
  10. /*--------------------------------------------------------------------------*/
  11. //条件编译
  12. #ifndef_JGRAPH_H_
  13. #define_JGRAPH_H_
  14. /*--------------------------------------------------------------------------*/
  15. //头文件
  16. #include<limits.h>
  17. //定义的宏
  18. #defineINFINITYINT_MAX
  19. #defineMAX_VERTEX_NUM20
  20. /*--------------------------------------------------------------------------*/
  21. //定义一系列类型
  22. enumGraphKind{DG,DN,UDG,UDN};//图的类型枚举
  23. typedefunsignedintVRType;
  24. typedefcharInfoType;
  25. typedefstruct
  26. {
  27. VRTypeadj;//顶点关系类型
  28. InfoType*info;//弧的信息
  29. }AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
  30. //图的定义
  31. template<typenameCustomType>
  32. classJMatrixGraph
  33. {
  34. public:
  35. JMatrixGraph():vexnum(0),arcnum(0){}//默认构造函数
  36. voidCreateGraph(GraphKindinputKind);//创建图
  37. private:
  38. voidCreateDG(void);//创建有向图
  39. voidCreateDN(void);//创建有向网
  40. voidCreateUDG(void);//创建无向图
  41. voidCreateUDN(void);//创建无向网
  42. CustomTypevexs[MAX_VERTEX_NUM];//顶点向量
  43. AdjMatrixarcs;//邻接矩阵
  44. intvexnum,arcnum;//图的顶点数和弧数
  45. GraphKindkind;//图的种类标志
  46. };
  47. template<typenameCustomType>
  48. voidJMatrixGraph<CustomType>::CreateGraph(GraphKindinputKind)
  49. {
  50. switch(inputKind)
  51. {
  52. caseDG:returnCreateDG();
  53. caseDN:returnCreateDN();
  54. caseUDG:returnCreateUDG();
  55. caseUDN:returnCreateUDN();
  56. }
  57. }
  58. template<typenameCustomType>//创建有向图
  59. voidJMatrixGraph<CustomType>::CreateDG(void)
  60. {
  61. inti,j,k;
  62. intv1,v2,incInfo;
  63. cout<<"输入顶点个数:/n";
  64. cin>>vexnum;
  65. cout<<"输入弧的个数:/n";
  66. cin>>arcnum;
  67. if(arcnum>vexnum*(vexnum-1)*0.5f)
  68. {
  69. cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
  70. return;
  71. }
  72. cout<<"输入弧的信息(0表示忽略):/n";
  73. cin>>incInfo;
  74. for(i=0;i<vexnum;i++)
  75. {
  76. cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
  77. cin>>vexs[i];
  78. }
  79. for(i=0;i<vexnum;i++)
  80. {
  81. for(j=0;j<vexnum;j++)
  82. {
  83. arcs[i][j].adj=0;
  84. arcs[i][j].info=NULL;
  85. }
  86. }
  87. for(k=0;k<arcnum;k++)
  88. {
  89. cout<<"请输入第"<<k+1<<"边连接的两个顶点。/n";
  90. cin>>v1>>v2;
  91. arcs[v1-1][v2-1].adj=1;
  92. if(incInfo!=0)
  93. {
  94. cout<<"输入弧的信息,以字符串的形式存储。/n";
  95. cin>>arcs[v1-1][v2-1].info;
  96. }
  97. }//这里设置断点,下同
  98. }
  99. template<typenameCustomType>//创建有向网
  100. voidJMatrixGraph<CustomType>::CreateDN(void)
  101. {
  102. inti,j,k;
  103. intv1,v2,incInfo;
  104. intw;
  105. cout<<"输入顶点个数:/n";
  106. cin>>vexnum;
  107. cout<<"输入弧的个数:/n";
  108. cin>>arcnum;
  109. if(arcnum>vexnum*(vexnum-1)*0.5f)
  110. {
  111. cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
  112. return;
  113. }
  114. cout<<"输入弧的信息(0表示忽略):/n";
  115. cin>>incInfo;
  116. for(i=0;i<vexnum;i++)
  117. {
  118. cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
  119. cin>>vexs[i];
  120. }
  121. for(i=0;i<vexnum;i++)
  122. {
  123. for(j=0;j<vexnum;j++)
  124. {
  125. arcs[i][j].adj=0;
  126. arcs[i][j].info=NULL;
  127. }
  128. }
  129. for(k=0;k<arcnum;k++)
  130. {
  131. cout<<"请输入第"<<k+1<<"边连接的两个顶点。/n";
  132. cin>>v1>>v2>>w;
  133. arcs[v1-1][v2-1].adj=w;
  134. if(incInfo!=0)
  135. {
  136. cout<<"输入弧的信息,以字符串的形式存储。/n";
  137. cin>>arcs[v1-1][v2-1].info;
  138. }
  139. }
  140. }
  141. template<typenameCustomType>//创建无向图
  142. voidJMatrixGraph<CustomType>::CreateUDG(void)
  143. {
  144. inti,j,k;
  145. intv1,v2,incInfo;
  146. cout<<"输入顶点个数:/n";
  147. cin>>vexnum;
  148. cout<<"输入弧的个数:/n";
  149. cin>>arcnum;
  150. if(arcnum>vexnum*(vexnum-1)*0.5f)
  151. {
  152. cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
  153. return;
  154. }
  155. cout<<"输入弧的信息(0表示忽略):/n";
  156. cin>>incInfo;
  157. for(i=0;i<vexnum;i++)
  158. {
  159. cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
  160. cin>>vexs[i];
  161. }
  162. for(i=0;i<vexnum;i++)
  163. {
  164. for(j=0;j<vexnum;j++)
  165. {
  166. arcs[i][j].adj=INFINITY;
  167. arcs[i][j].info=NULL;
  168. }
  169. }
  170. for(k=0;k<arcnum;k++)
  171. {
  172. cout<<"请输入第"<<k+1<<"边连接的两个顶点和权值。/n";
  173. cin>>v1>>v2;
  174. arcs[v1-1][v2-1].adj=1;
  175. if(incInfo!=0)
  176. {
  177. cout<<"输入弧的信息,以字符串的形式存储。/n";
  178. cin>>arcs[v1-1][v2-1].info;
  179. }
  180. arcs[v1-1][v2-1]=arcs[v2-1][v1-1];
  181. }
  182. }
  183. template<typenameCustomType>//创建无向网
  184. voidJMatrixGraph<CustomType>::CreateUDN(void)
  185. {
  186. inti,j,k;
  187. intv1,v2,incInfo;
  188. intw;
  189. cout<<"输入顶点个数:/n";
  190. cin>>vexnum;
  191. cout<<"输入弧的个数:/n";
  192. cin>>arcnum;
  193. if(arcnum>vexnum*(vexnum-1)*0.5f)
  194. {
  195. cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
  196. return;
  197. }
  198. cout<<"输入弧的信息(0表示忽略):/n";
  199. cin>>incInfo;
  200. for(i=0;i<vexnum;i++)
  201. {
  202. cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
  203. cin>>vexs[i];
  204. }
  205. for(i=0;i<vexnum;i++)
  206. {
  207. for(j=0;j<vexnum;j++)
  208. {
  209. arcs[i][j].adj=INFINITY;
  210. arcs[i][j].info=NULL;
  211. }
  212. }
  213. for(k=0;k<arcnum;k++)
  214. {
  215. cout<<"请输入第"<<k+1<<"边连接的两个顶点和权值。/n";
  216. cin>>v1>>v2>>w;
  217. arcs[v1-1][v2-1].adj=w;
  218. if(incInfo!=0)
  219. {
  220. cout<<"输入弧的信息,以字符串的形式存储。/n";
  221. cin>>arcs[v1-1][v2-1].info;
  222. }
  223. arcs[v1-1][v2-1]=arcs[v2-1][v1-1];
  224. }
  225. }
  226. #endif

下面是我随便使用一个C++源文件来进行验证:

Code:
  1. /*----------------------------------------------------------------------------
  2. 蒋轶民制作:E-mail:jiangcaiyang123@163.com
  3. ------------------------------------------------------------------------------
  4. 文件名:MainFrame.h
  5. ------------------------------------------------------------------------------
  6. 作用:验证图结构是否创建成功。
  7. /*--------------------------------------------------------------------------*/
  8. //头文件
  9. #include<iostream>
  10. #include"JGraph.h"
  11. usingnamespacestd;
  12. //程序的入口
  13. intmain(intargc,char**argv)
  14. {
  15. JMatrixGraph<char>jmg;
  16. jmg.CreateGraph(UDN);
  17. return0;
  18. }

下一次我准备使用邻接表来实现图的结构,而且将会进行图的深度搜索和广度搜索,我还想着使用DirectX来描绘我的图结构呢。期待我的成果吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值