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

控制台编程

开发平台:

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