Advertisement
Guest User

Main.c

a guest
Jan 23rd, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.01 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5.  
  6.  
  7. #include "Functions.h"
  8.  
  9.  
  10.  
  11. typedef struct node
  12. {
  13. char *first_city; //city_name
  14. int total_distance;
  15. struct node *next_node;
  16. struct list *dest_list;
  17. struct node *shortest_way;
  18. } node;
  19.  
  20. typedef struct list
  21. {
  22. char *second_city; //dest_city_name
  23. int distance; //single_dist
  24. struct node *dest_node;
  25. struct list *next_list_element;
  26. } list;
  27.  
  28. list* find_last_list_element(list* list_element)
  29. {
  30. while(list_element->next_list_element!=NULL)
  31. {
  32. list_element=list_element->next_list_element;
  33. return list_element;
  34.  
  35. }
  36. if(list_element==NULL)
  37. {
  38. return NULL;
  39. }
  40. }
  41. node* find_last_node(node* origin)
  42. {
  43. node* current_node=origin;
  44. while(current_node->next_node!=NULL)
  45. {
  46. current_node=current_node->next_node;
  47. }
  48. return current_node;
  49. }
  50.  
  51. node* find_existing_node(node* origin, char find_cuty[])
  52. {
  53. while(origin->next_node!=NULL)
  54. {
  55. origin=origin->next_node;
  56.  
  57. if(origin->first_city==NULL)
  58. {
  59. return NULL;
  60. }
  61. if(strcmp(origin->first_city,find_cuty)==0)
  62. {
  63. return origin;
  64. }
  65. }
  66. return NULL;
  67.  
  68.  
  69. }
  70. list* create_new_list(char second_city[], int temp_distance)
  71. {
  72. list* new_list=(list*)malloc(sizeof(list));
  73. new_list->next_list_element=NULL;
  74. new_list->distance=temp_distance;
  75. new_list->second_city=array_allocation(second_city);
  76. return new_list;
  77. }
  78. node* create_new_node(char first_city[])
  79. {
  80. node* new_node =(node*)malloc(sizeof(node));
  81. new_node->first_city=array_allocation(first_city);
  82. new_node->shortest_way=NULL;
  83. new_node->next_node=NULL;
  84. new_node->dest_list=NULL;
  85. return new_node;
  86. }
  87.  
  88. node* create_first_node(node *origin,char first_city[])
  89. {
  90. origin->first_city=array_allocation(first_city);
  91. origin->shortest_way=NULL;
  92. origin->next_node=NULL;
  93. origin->next_node=NULL;
  94. return origin;
  95. }
  96.  
  97. void be_toghether(node *origin, char first_city[], char second_city[], int distance)
  98. {
  99. node* start_node=find_existing_node(origin,first_city);
  100. if(start_node==NULL)
  101. {
  102. if(origin->first_city==NULL)
  103. {
  104. start_node=create_first_node(origin,first_city);
  105. }
  106. else
  107. {
  108. start_node=create_new_node(first_city);
  109. node* last_node=find_last_node(origin);
  110. last_node->next_node=start_node;
  111. }
  112. }
  113. node* dest_node=find_existing_node(origin,second_city);
  114. if(dest_node==NULL)
  115. {
  116. dest_node=create_new_node(second_city);
  117. node* last_node=find_last_node(origin);
  118. last_node->next_node=dest_node;
  119. }
  120. list* last_list_element=find_last_list_element(start_node->dest_list);
  121. list* new_list_element;
  122. new_list_element=create_new_list(second_city,distance);
  123. new_list_element->dest_node=dest_node;
  124. if(last_list_element==NULL)
  125. {
  126. start_node->dest_list=new_list_element;
  127. }
  128. else
  129. {
  130. last_list_element->next_list_element=new_list_element;
  131. }
  132. }
  133.  
  134. void reset_distance(node* Node)
  135. {
  136. double inf = INFINITY;
  137. if(Node!=NULL)
  138. {
  139. Node->total_distance=inf;
  140. Node->shortest_way=NULL;
  141. reset_distance(Node->next_node);
  142. }
  143. }
  144.  
  145. void set_distance_in_nodes(node* start_node, list* list_element)
  146. {
  147. if(list_element!=NULL)
  148. {
  149. node* destination_node=list_element->dest_node;
  150. if(destination_node->total_distance > start_node->total_distance + list_element->distance)
  151. {
  152. destination_node->total_distance = start_node->total_distance + list_element->distance;
  153. destination_node->shortest_way = start_node;
  154. set_distance_in_nodes(destination_node,destination_node->dest_list);
  155. }
  156. set_distance_in_nodes(start_node,list_element->next_list_element);
  157. }
  158. }
  159.  
  160. void set_distance(node* origin, char first_city[])
  161. {
  162. node* start_node=find_existing_node(origin,first_city);
  163. if(start_node!=NULL)
  164. {
  165. start_node->total_distance=0;
  166. set_distance_in_nodes(start_node,start_node->dest_list);
  167. }
  168. }
  169.  
  170. int scan_i_file(char *road_file_path,node* origin)
  171. {
  172. FILE* road_file=fopen(road_file_path,"r");
  173. if(road_file==NULL)
  174. {
  175. printf("Couldn't open input file.\n");
  176. help();
  177. return 1;
  178. }
  179. char first_city[128], second_city[128];
  180. char *first_city_pointer;
  181. char *second_city_pointer;
  182. int single_distance;
  183. while(!feof(road_file))
  184. {
  185. fscanf(road_file,"%s",first_city);
  186. first_city_pointer=array_allocation(first_city);
  187. fscanf(road_file,"%s",second_city);
  188. second_city_pointer=array_allocation(first_city);
  189. fscanf(road_file,"%d",&single_distance);
  190. be_toghether(origin,first_city_pointer,second_city_pointer,single_distance);
  191. }
  192. fclose(road_file);
  193. return 0;
  194. }
  195.  
  196. int print_to_file(node* origin, char first_city[], char second_city[],FILE* output_file)
  197. {
  198.  
  199. double inf = INFINITY;
  200. reset_distance(origin);
  201. set_distance(origin,first_city);
  202. node* dest_node=find_existing_node(origin,second_city);
  203.  
  204. if(!strcmp(first_city,second_city))
  205. {
  206. fprintf(output_file,"\n %s to %s = 0 \n",first_city,second_city);
  207. return 1;
  208. }
  209. if((dest_node==NULL) || (dest_node->total_distance==inf) || (dest_node->total_distance==0))
  210. {
  211. fprintf(output_file,"\n %s to %s: \nThere is no route\n",first_city,second_city);
  212. return 1;
  213. }
  214.  
  215. node* previous_node=dest_node;
  216. node* prevprev_node=previous_node->shortest_way;
  217. fprintf(output_file,"\n %s to %s (%d):\n",first_city,second_city,dest_node->total_distance);
  218. while(prevprev_node!=NULL)
  219. {
  220.  
  221. fprintf(output_file,"%s to %s %d\n",prevprev_node->first_city,previous_node->first_city,previous_node->total_distance-prevprev_node->total_distance);
  222. previous_node=prevprev_node;
  223. prevprev_node=previous_node->shortest_way;
  224. }
  225. }
  226. int print_result(char i_file_path[], char o_file_path[], node* origin,char hq[])
  227. {
  228. FILE *input_file=fopen(i_file_path,"r");
  229. if(input_file==NULL)
  230. {
  231. printf("FILE ERROR! Couldn't open -t file!\n");
  232. help();
  233. return 1;
  234. }
  235. FILE *output_file=fopen(o_file_path,"w");
  236. if(output_file==NULL)
  237. {
  238. printf("FILE ERROR! Couldn't open -o file!\n");
  239. fclose(input_file);
  240. help();
  241. return 1;
  242. }
  243. char first_city[strlen(hq)+1];
  244. strcpy(first_city,hq);
  245. char second_city[128];
  246. char something[128];
  247. int bb;
  248. while(!feof(input_file))
  249. {
  250. fscanf(input_file,"%s",something);
  251. fscanf(input_file,"%s",second_city);
  252. fscanf(input_file,"%d",&bb);
  253. print_to_file(origin,first_city,second_city,output_file);
  254. }
  255. fclose(input_file);
  256. fclose(output_file);
  257. return 0;
  258. }
  259. void free_list(list* list_element)
  260. {
  261. if(list_element->next_list_element!=NULL)
  262. {
  263. free_list(list_element->next_list_element);
  264. free(list_element->second_city);
  265. }
  266. free(list_element);
  267. }
  268.  
  269. void free_all(node* origin)
  270. {
  271. if(origin->next_node!=NULL)
  272. {
  273. free(origin->first_city);
  274. free_all(origin->next_node);
  275. }
  276. if(origin->dest_list!=NULL)
  277. {
  278. free_list(origin->dest_list);
  279. }
  280. free(origin);
  281. }
  282. int main(int argc, char **argv)
  283. {
  284. char *input;
  285. char *output;
  286. char *headquarter;
  287. char hq[128];
  288.  
  289. if(console_check(argc,argv,&input,&output,&headquarter)==0)
  290. {
  291. return 1;
  292. }
  293.  
  294. node* first_node=(node*)malloc(sizeof(node));
  295. first_node->dest_list=NULL;
  296. first_node->next_node=NULL;
  297. first_node->shortest_way=NULL;
  298. first_node->first_city=NULL;
  299.  
  300. if(scan_i_file(input,first_node)==1)
  301. {
  302. return 1;
  303. }
  304.  
  305. print_result(input,output,first_node,hq);
  306.  
  307. free_all(first_node);
  308.  
  309. return 0;
  310. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement