trainGraph.c
上传用户:janny_wxd
上传日期:2010-02-03
资源大小:261k
文件大小:6k
源码类别:

控制台编程

开发平台:

C/C++

  1. #include"train.h"
  2. status creat_graph(graph_country *l)
  3. {
  4. FILE *f;
  5. int n;
  6. int i=0,k=0;
  7. // path_node *no;
  8. path pa;
  9. char filename[]="f:\trainGraph.txt";
  10. if((f=fopen(filename,"r"))==NULL)
  11. {
  12. printf("can not open file to read(fscanf):%sn",filename);
  13. return ERROR;
  14. }
  15. // init_graph(l);
  16. // fscanf(f,"%d%d",&(l->city_num),&(l->path_num ));
  17. for (i=0;i<l->city_num ;i++)
  18. {
  19. fscanf(f,"%s",l->adj_list[i].city_name );
  20. insert_city(l,l->adj_list[i].city_name,i );
  21. }
  22. for (k=0;k<l->path_num ;k++)
  23. {
  24. n=fscanf(f,"%d%d%d",&(pa.ivex),&(pa.jvex) ,&(pa.length));
  25. // PR("pa.length :%dn",pa.length);
  26. if(pa.length >0) insert_path(l,pa);
  27. }
  28. fclose(f);
  29. /*for (i=0;i<MAXSIZE;i++)
  30. {
  31. for (no=l->adj_list [i].firsh_path ->i_link ;no->i_link !=NULL;no=no->i_link )
  32. PR("%s",l->adj_list [no->pa.ivex ].city_name );
  33. PR("n");
  34. }*/
  35. return OK;
  36. }
  37. status init_graph(graph_country *l)
  38. {
  39. int i=0;
  40. /* l=(graph_country*)malloc(sizeof(graph_country));
  41. if(l==NULL)
  42. {
  43. exit(0);
  44. }*/
  45. for (i=0;i<MAXSIZE;i++)
  46. {
  47. l->adj_list [i].firsh_path=NULL;
  48. // l->adj_list [i].firsh_path->i_link  =NULL;
  49. // l->adj_list [i].firsh_path->j_link =NULL;
  50. }
  51. l->city_num =25;
  52. l->path_num =30;
  53. return OK;
  54. }
  55. status insert_city(graph_country *l,char *city_name,int i)
  56. {
  57. strcpy(l->adj_list[i].city_name ,city_name);
  58. // PR("insert %s,%dn",city_name,i);
  59. return OK;
  60. }
  61. status insert_path(graph_country *l,path pa)
  62. {
  63. path_node_p q;
  64. q=(path_node_p)malloc(sizeof(path_node));
  65. if(q==NULL)
  66. {
  67. exit(0);
  68. }
  69. q->pa .ivex =pa.ivex ;
  70. q->pa .jvex =pa.jvex ;
  71. q->pa .length =pa.length ;
  72. /* q->i_link=NULL;
  73. // q->j_link =NULL;
  74. q->i_link =l->adj_list [pa.ivex ].firsh_path  ;
  75. l->adj_list [pa.ivex ].firsh_path  =q;
  76. q->j_link =l->adj_list [pa.jvex ].firsh_path  ;
  77. l->adj_list [pa.jvex ].firsh_path  =q;*/
  78. q->i_link =l->adj_list [pa.ivex ].firsh_path ;
  79. q->j_link =l->adj_list [pa.jvex ].firsh_path  ;
  80. l->adj_list [pa.ivex ].firsh_path =l->adj_list [pa.jvex ].firsh_path =q;
  81. return OK;
  82. }
  83. void init_p(path_city *pa)
  84. {
  85. //初始化为一条空路径
  86. pa->len =0;
  87. }
  88. void init_set(p_city *p)
  89. {
  90. int i;
  91. p->num =0;
  92. for(i=0;i<MAXSIZE;i++)
  93. {
  94. p->citys[i][0]='';
  95. }
  96. }
  97. void copy_path(path_city *pa1,path_city *pa2)
  98. {
  99. //复制路径
  100. int i;
  101. for (i=0;i<pa2->len ;i++)
  102. {
  103. pa1->path [i].vx =pa2->path [i].vx ;
  104. pa1->path [i].vy =pa2->path [i].vy ;
  105. }
  106. pa1->len =pa2->len ;
  107. }
  108. void insert_p(path_city *pa,int v,int w)
  109. {
  110. //在pa中插入一条边(v,w)
  111. pa->path [pa->len ].vx =v;
  112. pa->path [pa->len ].vy =w;
  113. pa->len ++;
  114. // PR("insert (%d,%d)n",v,w);
  115. }
  116. void out_path(graph_country l,path_city pa,p_city *citys)
  117. {
  118. //将路径转换为城市名称的序列
  119. int m=0,i;
  120. char city_name[9];
  121. for(i=0;i<pa.len ;i++)
  122. {
  123. get_city(l,pa.path [i].vx ,city_name);
  124. strcpy(citys->citys[m++], city_name);
  125. PR("%sn",city_name);
  126. }
  127. // PR("%sn",city_name);
  128. get_city(l,pa.path[pa.len-1].vy ,city_name);
  129. // PR("pa.len:%dn",pa.len );
  130. strcpy(citys->citys[m] ,city_name);
  131. citys->num =m;
  132. // PR("//将路径转换为城市名称的序列完成n");
  133. }
  134. void get_city(graph_country l,int i, char *city_name)
  135. {
  136. //以city_name返回邻接多重表中序号为i顶点的城市名(l.adj_list [i].city_name )
  137. strcpy(city_name,l.adj_list [i].city_name );
  138. }
  139. void putin_set(char *city_name,p_city *p,int st)
  140. {
  141. strcpy(p->citys [st],city_name);
  142. p->num ++;
  143. }
  144. path_node *first_path(graph_country l,int vi)
  145. {
  146. //返回图中依附于顶点的第一条这的指针:l.adj_list [vi].firsh_path
  147. path_node *p;
  148. p=l.adj_list [vi].firsh_path ;
  149. return p;
  150. }
  151. path_node *next_path(graph_country g,int vi,path_node p,int *vj,path_node *q)
  152. {
  153. //以vj返回图g中依附于顶点vi的一条边(由指针p所指)的另一端点;
  154. //以q返回图中依附于顶点vi且相对于指针p所指边的下一条边
  155. if(p.pa.ivex ==vi)
  156. {
  157. q=p.i_link ;
  158. *vj=p.pa .jvex ;
  159. }
  160. else 
  161. {
  162. q=p.j_link ;
  163. *vj=p.pa .ivex ;
  164. }
  165. return q;
  166. }
  167. int minnal(int *dist,p_city ss)
  168. {
  169. //求dist[]中的最小边
  170. int min=-1,i,temp;
  171. temp =maxint;
  172. for(i=0;i<MAXSIZE;i++)
  173. {
  174. if(ss.citys [i][0]=='')
  175. {
  176. if(temp>dist[i])
  177. {
  178. min=i;
  179. temp=dist[i];
  180. }
  181. }
  182. }//end for
  183. if(min!=-1)
  184. {
  185. // PR("求dist[]中的最小边 min:%dn",min);
  186. return min;
  187. }
  188. else
  189. {
  190. PR("求最小边时发生错误!n");
  191. return -1;
  192. }
  193. }
  194. void shortest_path(graph_country g,int st,int nd,int *pathlength,p_city *path_info)
  195. {
  196. //利用迪杰斯特拉算法的基本思想求图g中从顶点st到顶点nd的一条最短路径
  197. //最短路径path_info及其路径长度path_lenth
  198. int dist[MAXSIZE];
  199. int i=0,v,w;
  200. path_node  q;
  201. int found,min;
  202. p_city ss;
  203. int adjvex;
  204. path_node *p,*qq;
  205. path_city path[MAXSIZE];
  206. for (i=0;i<g.city_num ;i++)
  207. {
  208. dist[i]=maxint;
  209. init_p(&path[i]);
  210. }
  211. p=first_path(g,st);
  212. while(p!=NULL)//初始化dist数组,检测依附于起始边的每一条边
  213. {
  214. qq=next_path(g,st,*p,&adjvex,&q);
  215. dist[adjvex]=p->pa.length ;
  216. insert_p(&path[adjvex],st,adjvex);
  217. p=qq;
  218. }
  219. found =FALSE;
  220. init_set(&ss);
  221. putin_set(g.adj_list[st].city_name ,&ss,st);
  222. while(!found)
  223. {
  224. min=minnal(dist,ss);
  225. //在所有尚未求得最短路径的顶点中求使dist[i]取小值的i值
  226. if(min==nd) found= TRUE;
  227. else 
  228. {
  229. v=min;
  230. putin_set(g.adj_list[v].city_name,&ss,v);
  231. p=first_path(g,v);
  232. while(p!=NULL)//检测依附于v的每一条尚未访问的边
  233. {
  234. qq=next_path(g,v,*p,&w,qq);
  235. if((ss.citys [w][0]=='')&&((dist[v]+p->pa .length )<dist[w]))
  236. {
  237. dist[w]=dist[v]+p->pa.length ;
  238. copy_path(&path[w],&path[v]);
  239. insert_p(&path[w],v,w);
  240. }
  241. p=qq;
  242. }//while(p!=NULL)
  243. }//else
  244. }//while(!found)
  245. pathlength=&dist[nd];
  246. PR("总路径长度 :%dn",dist[nd]);
  247. out_path(g,path[nd],&ss);
  248. }