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

控制台编程

开发平台:

C/C++

  1. #include"train.h"
  2. //char *city_name_list[MAXSIZE]={"西宁","乌鲁木齐","哈尔滨","呼和浩特","北京","长春","沈阳","大连","天津","徐州","上海","福州","南昌","深圳","广州","株州","武汉","郑州","西安","成都","贵阳","柳州","南宁","昆明","兰州"};
  3. town *init_town(){//初始化链表
  4. town *l;
  5. l=(town*)malloc(sizeof(town));
  6. if(l==NULL){
  7. exit(OVERFLOW);
  8. }
  9. l->next_town =NULL;
  10. return l;
  11. }
  12. train *init_train(){//初始化链表
  13. train *l;
  14. l=(train*)malloc(sizeof(train));
  15. if(l==NULL){
  16. exit(OVERFLOW);
  17. }
  18. l->next_town =NULL;
  19. l->next_train =NULL;
  20. return l;
  21. }
  22. status insert_train(train *l, char *train_num,char *start_place,char *end_place,int fare,int hour)
  23. {
  24. //火车链表的插入操作
  25. train *p;
  26. p=(train*)malloc(sizeof(train));
  27. strcpy(p->train_num ,train_num);
  28. strcpy(p->start_place ,start_place);
  29. strcpy(p->end_place ,end_place);
  30. p->fare =fare;
  31. p->hour =hour;
  32. p->next_town =NULL;
  33. p->next_train =l->next_train ;
  34. l->next_train =p;
  35. return OK;
  36. }
  37. status insert_town(train *l,char *name,time_train arrive,time_train leave)
  38. {
  39. //城市的插入操作
  40. town *p;
  41. // PR("//城市的插入操作n");
  42. // for(q=l->next_town ;q!=NULL;q=q->next_town );
  43. p=(town*)malloc(sizeof(town));
  44. strcpy(p->name ,name);
  45. p->arrive .day =arrive.day ;
  46. p->arrive .hour =arrive.hour ;
  47. p->arrive .minute =arrive.minute ;
  48. p->leave .day =leave.day ;
  49. p->leave .hour =leave.hour ;
  50. p->leave .minute =leave.minute;
  51. p->next_town =NULL;
  52. p->next_town =l->next_town ;
  53. l->next_town =p;
  54. /* if(l->next_town ==NULL) l->next_town =p;
  55. else q->next_town =p;*/
  56. return OK;
  57. }
  58. status find_train_num(train *l,char *train_num)
  59. {
  60. //用火车序列号来查询
  61. train *p;
  62. p=l->next_train;
  63. for(;p!=NULL;p=p->next_train )
  64. {
  65. if(strcmp(train_num,p->train_num )==0)
  66. {
  67. PR("列车号  始发站  终点站       车费        时间n");
  68. PR("%-8s%-8s%-8s%8d元%8d小时n",p->train_num ,p->start_place ,p->end_place ,p->fare ,p->hour );
  69. return OK;
  70. }
  71. }
  72. PR("对不起,无 %s 列车!n",train_num);
  73. return ERROR;
  74. }
  75. status find_town(train *l,char *name)
  76. {
  77. //查找中转站
  78. train *p;
  79. town *q;
  80. int find=0;
  81. p=l;
  82. for (;p!=NULL;p=p->next_train)
  83. {
  84. for (q=p->next_town ;q!=NULL;q=q->next_town)
  85. {
  86. if(strcmp(name,q->name)==0)
  87. {
  88. //print_town(*p);
  89. PR("%s 号列车的将在%d时:%d分 到达%sn",p->train_num,q->arrive.hour,q->arrive.minute,name );
  90. PR("%s 号列车的将在%d时:%d分从%s出发n",p->train_num,q->leave.hour,q->leave.minute,name );
  91. find++;
  92. break;
  93. }
  94. }
  95. }
  96. PR("有 %d 辆列车途经此地n",find);
  97. return OK;
  98. }
  99. status find_place(train *l,char *start_place,char *end_place,char choice)
  100. {                            //choice 0:最快,1:最省钱,2:全部
  101. //用始发始发站和终点站来查询
  102. train *p;
  103. train *q[SIZE];
  104. train *r;
  105. int i=0,j=0;
  106. p=l->next_train;
  107. for(;p!=NULL;p=p->next_train  )
  108. {
  109. if(strcmp(start_place,p->start_place)==0&&strcmp(end_place,p->end_place)==0)
  110. {
  111. // PR("%s,%s,%s,%d,%dn",p->train_num ,p->start_place ,p->end_place ,p->fare ,p->hour );
  112. q[i]=p;
  113. i++;
  114. }
  115. }
  116. if(i>0)
  117. {
  118. if(choice=='0')
  119. {
  120. r=q[0];
  121. for(j=1;j<i;j++)
  122. {
  123. if(q[j]->hour <r->hour )
  124. {
  125. r=q[j];
  126. }
  127. }
  128. PR(" 列车号  始发站  终点站    车费        时间n");
  129. PR("%8s%8s%8s%8d元%8d小时n",r->train_num ,r->start_place ,r->end_place ,r->fare ,r->hour );
  130. return OK;
  131. }
  132. else if (choice=='1')
  133. {
  134. r=q[0];
  135. for(j=1;j<i;j++)
  136. {
  137. if(q[j]->fare < r->fare )
  138. {
  139. r=q[j];
  140. }
  141. }
  142. PR("   列车号  始发站  终点站    车费        时间n");
  143. PR("%-8s%-8s%-8s%8d元%8d小时n",r->train_num ,r->start_place ,r->end_place ,r->fare ,r->hour );
  144. return OK;
  145. }
  146. else if (choice=='2')
  147. {
  148. for(j=0;j<i;j++)
  149. {
  150. PR("   列车号  始发站  终点站    车费        时间n");
  151. PR("%8s%8s%8s%8d元%8d小时n",q[j]->train_num ,q[j]->start_place ,q[j]->end_place ,q[j]->fare ,q[j]->hour );
  152. }
  153. }
  154. }
  155. else {//当没有一辆时.
  156. PR("无符合条件的列车!n");
  157. return ERROR;
  158. }
  159. return ERROR;
  160. }
  161. status creat_train(train *l)
  162. {
  163. //内置数据来创建火车链表
  164. int i=0;
  165. char *train_num[]={"T167","T168","1363","1364","37","38","K701","K702","T61","T62"};
  166. char *start_place[]={"北京","南昌","北京","成都","北京","武汉","北京","太原","北京","贵阳"};
  167. char *end_place[]={"南昌","北京","成都","北京","武汉","北京","太原","北京","贵阳","北京"};
  168. int fare[]={170,170,150,150,140,140,40,40,201,201};
  169. int hour[]={14,14,22,22,11,11,5,5,27,27};
  170. for(i=0;i<10;i++)
  171. {
  172. insert_train(l,train_num[i],start_place[i],end_place[i],fare[i],hour[i]);
  173. }
  174. return OK;
  175. }
  176. status creat_train_f(train *l)
  177. {
  178. //用读入文件的方式创建火车信息单链表
  179. int i,j,num,town_num;
  180. char train_num[9];
  181. char start_place[9];
  182. char end_place[9];
  183. int fare;
  184. int hour;
  185. time_train arrive;
  186. time_train leave;
  187. int day_a,day_l,hour_a,hour_l,minute_a,minute_l;
  188. char name[9];
  189. FILE *f;
  190. char filename[]=".\train.dat";
  191. if((f=fopen(filename,"r"))==NULL)
  192. {
  193. printf("can not open file to read(fscanf):%sn",filename);
  194. return ERROR;
  195. }
  196. fscanf(f,"%d",&num);
  197. // PR("num:%dn",num);
  198. for(i=0;i<num;i++)
  199. {
  200. fscanf(f,"%d",&town_num);
  201. fscanf(f,"%s%s%s%d%d",train_num ,start_place ,end_place ,&fare ,&hour );
  202. insert_train(l,train_num ,start_place ,end_place ,fare ,hour );
  203. for(j=0;j<town_num;j++)
  204. {
  205. fscanf(f,"%s%d%d%d%d%d%d",name,&day_a,&hour_a,&minute_a,&day_l,&hour_l,&minute_l);
  206. // PR("%s,%s,%d,%d,%d,%d,%d,%dn",train_num,name,day_a,day_l,hour_a,hour_l,minute_a,minute_l);
  207. arrive.day =day_a;
  208. arrive.hour =hour_a;
  209. arrive.minute =minute_a;
  210. leave.day =day_l;
  211. leave.hour =hour_l;
  212. leave.minute =minute_l;
  213. if(l->next_train ==NULL)
  214. {
  215. insert_town(l,name,arrive,leave);
  216. }
  217. else insert_town(l->next_train,name,arrive,leave);
  218. }//end for j
  219. }
  220. fclose(f);
  221. // PR("文件数据写入成功!n");
  222. return OK;
  223. }
  224. status print_train(train *l)
  225. {
  226. //打印火车信息,包括中转站
  227. train *p=l;
  228. town *q;
  229. PR("   列车号  始发站  终点站    车费        时间n");     
  230. for(p=p->next_train ;p!=NULL;p=p->next_train )
  231. {
  232. PR("   列车号  始发站  终点站    车费        时间n");
  233. PR("%8s%8s%8s%8d元%8d小时n",p->train_num ,p->start_place ,p->end_place ,p->fare ,p->hour );
  234. PR(      "车站    到达时间      开出时间n");
  235. for (q=p->next_town;q!=NULL;q=q->next_town)
  236. {
  237. PR(      "%-8s   %d:%d:%d  %d:%d:%dn",q->name,q->arrive .day ,q->arrive .hour ,q->arrive.minute ,q->leave .day ,q->leave .hour ,q->leave .minute);
  238. }
  239. PR("n");
  240. }
  241. return OK;
  242. }
  243. int city_name_int(graph_country l,char *name)
  244. {
  245. //在城市与计算机储存序号之间建立一一映射
  246. int i;
  247. for(i=0;i<l.city_num ;i++)
  248. {
  249. if(strcmp(name,l.adj_list [i].city_name )==0) return i;
  250. }
  251. PR("无此城市!n");
  252. return -1;
  253. }
  254. status print_graph(graph_country g)
  255. {
  256. //打印城市图的信息
  257. int i;
  258. for (i=0;i<g.city_num ;i++)
  259. {
  260. PR("%2d->%-8s   ",i,g.adj_list [i].city_name );
  261. if((i+1)%5==0) PR("n");
  262. }
  263. return OK;
  264. }
  265. void train_main()
  266. {
  267. //全国旅游交通查询的执行函数
  268. char ch,ch2,choice,start_place[9],end_place[9],train_num[8];
  269. int t=1,tt=1,start,end;
  270. char town_name[9];
  271. graph_country g;
  272. int pathlength;
  273. p_city pathinfo;
  274. train *tr=init_train();
  275. creat_train_f(tr);
  276. init_graph(&g);
  277. creat_graph(&g);
  278. while(t==1)
  279. {
  280. PR("*---------------------------------------*n");
  281. PR("*--旅游交通查询系统选择菜单-------------*n");
  282. PR("*     火车信息查询---------0      *n");
  283. PR("*     最短路径查询---------1      *n");
  284. PR("*     查看火车信息---------2      *n");
  285. PR("*     查看城市信息---------3      *n");
  286. PR("*     退出-----------------4      *n");
  287. PR("*---------------------------------------*n");
  288. PR("请选择: ");
  289. ch = getch();
  290. PR("%cn",ch);
  291. if(ch=='0')
  292. {
  293. while(tt==1)
  294. {
  295. PR("*--火车信息查询选择菜单-----------------*n");
  296. PR("*  按车次查询--------------0      *n");
  297. PR("*  按出发地与目的地查询----1      *n");
  298. PR("*  中转站查询--------------2      *n");
  299. PR("*  查看火车信息------------3      *n");
  300. PR("*  退出火车信息查询--------4      *n");
  301. PR("*---------------------------------------*n");
  302. PR("请选择: ");
  303. ch2 = getch();
  304. PR("%cn",ch2);
  305. if(ch2=='0')
  306. {
  307. PR("请输入列车号: ");
  308. scanf("%s",train_num);
  309. find_train_num(tr,train_num);
  310. }
  311. else if(ch2=='1')
  312. {
  313. PR("请输入始发站: ");
  314. scanf("%s",start_place);
  315. PR("请输入终点站: ");
  316. scanf("%s",end_place);
  317. PR("*----------------------------*n");
  318. PR("*--按车次查询选择菜单------*n");
  319. PR("*  最快-------0        *n");
  320. PR("*  最省钱-----1        *n");
  321. PR("*  全部-------2        *n");
  322. PR("*  退出-------3        *n");
  323. PR("*----------------------------*n");
  324. PR("请选择: ");
  325. choice = getch();
  326. PR("%cn",choice);
  327. find_place(tr,start_place,end_place,choice);
  328. }
  329. else if(ch2=='2'){
  330. PR("请输入您想查询的中转站名: ");
  331. scanf("%s",town_name);
  332. find_town(tr,town_name);
  333. }
  334. else if(ch2=='3'){
  335. print_train(tr);
  336. }
  337. else if(ch2=='4'){
  338. tt=0;
  339. }
  340. else {
  341. PR("你的输入有误n");
  342. }
  343. }//end while
  344. }//end ch=0:火车信息查询
  345. else if(ch=='1')
  346. {
  347. PR("请输入出发地: ");
  348. scanf("%s",start_place);
  349. start=city_name_int(g,start_place);
  350. PR("请输入目的地: ");
  351. scanf("%s",end_place);
  352. end=city_name_int(g,end_place);
  353. if(start!=1&&end!=-1){
  354. shortest_path(g,start,end,&pathlength,&pathinfo);
  355. }
  356. }
  357. else if(ch=='2')
  358. {
  359. print_train(tr);
  360. }
  361. else if(ch=='3')
  362. {
  363. print_graph(g);
  364. }
  365. else if(ch=='4')
  366. {
  367. t=0;
  368. }
  369. else {
  370. PR("你的输入有误n");
  371. }
  372. }//end while
  373. }