鱼C论坛

 找回密码
 立即注册
查看: 3911|回复: 4

构造无向网出错,是怎么回事,求解?

[复制链接]
发表于 2013-10-6 11:09:15 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 付笑 于 2013-10-6 11:12 编辑

问题:

1.网的顶点,初始赋值的是时候是{v0,v1,v2,v3,v4,v5,v6,v7,v8}
   可是经调试,运行到代码   “G->arcs[j][i]=G->arcs[j];//无向,两个单元的信息相同” 时,有几次竟然改变了,顶点中的一些值,结果造成输出的顶点错误,而且也造成邻接矩阵的值也没有完全正确,就是有些边没有加上,

请问是什么原因了? 同样的代码我在构造另一个图是却是有正确的结果,不解
[/i]


要构造的网如下:

                               
登录/注册后可看大图


构造代码如下:

  1. #include <stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>

  4. #define INFINITY 9999
  5. #define MAX_INFO 20
  6. #define MAX_VERTEX_NUM 20
  7. #define MAX_NAME 9

  8. typedef int VRType;
  9. typedef char InfoType;
  10. typedef enum{DG,DN,UDG,UDN} GraphKind;//{有向图,有向网,无向图,无向网}


  11. struct VertexType
  12. {
  13. char name[MAX_NAME];
  14. };


  15. typedef struct ArcCell //边或弧信息结构
  16. {
  17. VRType adj;//VRType 是顶点关系类型。对无权图,用1或0
  18. //表示相邻否;对带权图,则为权值类型。

  19. InfoType *info;//该弧相关信息指针
  20. }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵

  21. typedef struct
  22. {
  23. VertexType vexs[MAX_VERTEX_NUM];//顶点向量
  24. AdjMatrix arcs;
  25. int vexnum,arcnum;//图的当前顶点数和弧数
  26. GraphKind kind ; //图的种类标志
  27. }MGraph;

  28. //==============================================与顶点类型配套的访问顶点的函数
  29. void Visit(VertexType ver)
  30. {
  31. printf("%s",ver.name);
  32. }
  33. //==================================================与顶点类型配套的输入顶点信息的函数
  34. void Input(VertexType *ver)
  35. {
  36. scanf("%s",ver->name);
  37. }

  38. //==================================================与弧或边类型配套的输入弧或边的相关信息的函数

  39. void InputArc(InfoType **arc)
  40. {
  41. char s[MAX_INFO];
  42. int m;
  43. printf("请输入该弧(边)的相关信息(<%d个字符):",MAX_INFO);
  44. gets(s);
  45. m=strlen(s);
  46. if(m>0)
  47. {
  48. *arc=(char*)malloc((m+1)*sizeof(char));
  49. strcpy(*arc,s);
  50. }







  51. }
  52. void OutputArc(InfoType *arc)
  53. {
  54. printf("%s\n",arc);
  55. }

  56. //============================================ =====求顶点在图中的位置
  57. int LocateVex(MGraph G,VertexType u)
  58. {
  59. //初始条件:图G存在,u和G中顶点有相同的特征(顶点名称相同)
  60. //操作结果:若G中存在顶点u,则返回该顶点在图中位置(序号);否则返回-1
  61. //位置就是顶点数组的下标

  62. int i;
  63. for(i=0;i<MAX_VERTEX_NUM;i++)
  64. {


  65. if(strcmp(u.name,G.vexs[i].name)==0)//
  66. {
  67. return i;
  68. }



  69. }
  70. return -1;
  71. }



  72. //==============================================================构造无向网G 方法3
  73. void CreateUDN3(MGraph *G)
  74. {
  75. //采用数组表示法(邻接矩阵),构造有向图
  76. int i,j,k,IncInfo;//IncInfo为0则弧不含相关信息;
  77. VRType w,weight[16];
  78. VertexType verchar[9],vchar1[16],vchar2[16];//verchar 为顶点数组,vchar1,vchar2为边的起点和终点数组

  79. VertexType v1,v2;//顶点类型

  80. char c[5];

  81. for(i=0;i<9;i++)
  82. {
  83. verchar[i].name[0]='V';
  84. verchar[i].name[1]='\0';
  85. c[0]='0'+i;
  86. c[1]='\0';
  87. strcat(verchar[i].name,c);
  88. }

  89. //下面是每条边的起点,终点,和权值
  90. vchar1[0]=verchar[0]; vchar2[0]=verchar[1];weight[0]=1;
  91. vchar1[1]=verchar[0]; vchar2[1]=verchar[2];weight[1]=5;
  92. vchar1[2]=verchar[1]; vchar2[2]=verchar[2];weight[2]=3;
  93. vchar1[3]=verchar[1]; vchar2[3]=verchar[3];weight[3]=7;
  94. vchar1[4]=verchar[1]; vchar2[4]=verchar[4];weight[4]=5;
  95. vchar1[5]=verchar[2]; vchar2[4]=verchar[3];weight[5]=1;
  96. vchar1[6]=verchar[2]; vchar2[6]=verchar[5];weight[6]=7;
  97. vchar1[7]=verchar[3]; vchar2[7]=verchar[4];weight[7]=2;
  98. vchar1[8]=verchar[3]; vchar2[8]=verchar[6];weight[8]=3;
  99. vchar1[9]=verchar[4]; vchar2[9]=verchar[5];weight[9]=3;
  100. vchar1[10]=verchar[4]; vchar2[10]=verchar[6];weight[10]=6;
  101. vchar1[11]=verchar[4]; vchar2[11]=verchar[7];weight[11]=9;
  102. vchar1[12]=verchar[5]; vchar2[12]=verchar[7];weight[12]=5;
  103. vchar1[13]=verchar[6]; vchar2[13]=verchar[7];weight[13]=2;
  104. vchar1[14]=verchar[6]; vchar2[14]=verchar[8];weight[14]=7;
  105. vchar1[15]=verchar[7]; vchar2[15]=verchar[8];weight[15]=4;


  106. G->vexnum=9;//输入顶点数
  107. G->arcnum=16;//边数
  108. IncInfo=0;

  109. //给各个顶点赋值
  110. for(i=0;i<G->vexnum;i++)
  111. {

  112. G->vexs[i]=verchar[i];
  113. }

  114. for(i=0;i<G->vexnum;i++)//初始化二维邻接矩阵
  115. {
  116. for(j=0;j<G->vexnum;j++)
  117. {
  118. G->arcs[i][j].adj=INFINITY;
  119. G->arcs[i][j].info=NULL;//无相关信息
  120. }
  121. }

  122. //构造边
  123. for(k=0;k<G->arcnum;k++)
  124. {


  125. v1=vchar1[k];v2=vchar2[k];w=weight[k];
  126. i=LocateVex(*G,v1);//顶点1的序号
  127. j=LocateVex(*G,v2);//顶点2的序号
  128. G->arcs[i][j].adj=w;//图

  129. if(IncInfo)
  130. {
  131. InputArc(&G->arcs[i][j].info);
  132. }

  133. G->arcs[j][i]=G->arcs[i][j];//无向,两个单元的信息相同

  134. }
  135. G->kind=UDN;


  136. }

  137. //==============================================================打印图

  138. void print(MGraph G)
  139. {
  140. int i,j;

  141. printf("\n无向网顶点如下:\n");

  142. for(i=0;i<G.vexnum;i++)
  143. {
  144. printf("%s \n",(G).vexs[i].name);
  145. }



  146. printf("\n下面是邻接矩阵\n");

  147. for(i=0;i<G.vexnum;i++)
  148. {
  149. for(j=0;j<G.vexnum;j++)
  150. {
  151. printf("%6d ",(G).arcs[i][j].adj);
  152. }
  153. printf("\n");

  154. }
  155. }




  156. main()
  157. {
  158. MGraph G;


  159. CreateUDN3(&G);
  160. print(G);
  161. return 0;
  162. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-6 11:34:48 | 显示全部楼层
知道错在哪里了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-10-6 16:29:14 | 显示全部楼层
付笑 发表于 2013-10-6 11:34
知道错在哪里了

那你就把帖子删了吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-10-25 16:01:42 | 显示全部楼层
天文数字:cry
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-11-17 08:49:28 | 显示全部楼层
好文章转过来方便自己看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 21:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表