Update cv6/a_station.c
This commit is contained in:
		
							parent
							
								
									43a01772fa
								
							
						
					
					
						commit
						5929e3a69f
					
				
							
								
								
									
										192
									
								
								cv6/a_station.c
									
									
									
									
									
								
							
							
						
						
									
										192
									
								
								cv6/a_station.c
									
									
									
									
									
								
							| @ -1,91 +1,109 @@ | ||||
| #ifndef STATION_H | ||||
| #define STATION_H | ||||
| // Pocet trati k dispozicii
 | ||||
| #define STATION_SIZE 10 | ||||
| // Maximalny pocet znakov pre ulozenie nazvu cielovej stanice
 | ||||
| #define TARGET_SIZE 36 | ||||
| struct station* create_station(){ | ||||
|    struct station* station = (struct station*)calloc(1,sizeof(struct station)); | ||||
|    station->tracks = (struct car**)calloc(STATION_SIZE, sizeof(struct car*)); | ||||
|    station->track_count = STATION_SIZE; | ||||
|    return station; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Jeden zaznam o kapacite do cielovej stanice | ||||
|  */ | ||||
| struct car { | ||||
|     // Cielova stanica / nazov
 | ||||
|     char value[TARGET_SIZE]; | ||||
|     // Pocet cestujuchich
 | ||||
|     int capacity; | ||||
|     // Smernik na dalsi zaznam
 | ||||
|     struct car* next; | ||||
| }; | ||||
| void destroy_station(struct station* station){ | ||||
|     free(station->tracks); | ||||
|     free(station); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Cela databaza zaznamov | ||||
|  */ | ||||
| struct station { | ||||
|     // Dynamicke pole smernikov na zaznamy
 | ||||
|     // jeden zaznam ma typ struct car*
 | ||||
|     struct car** tracks; | ||||
|     // Velkost pola tracks
 | ||||
|     int track_count; | ||||
| }; | ||||
| int select_track(struct station* station, const char* target) | ||||
| { | ||||
|     int i=0; | ||||
|     char t=0; | ||||
|     while(target[i]!=0) | ||||
|     { | ||||
|       t+=target[i]; // або інша хеш функція 
 | ||||
|     } | ||||
|     if(t<0) {t=-t;} | ||||
|      | ||||
|     i=t%10; //інд в хеш таб
 | ||||
|      | ||||
|     // if(station->tracks[i]==NULL)
 | ||||
|     // {
 | ||||
|     //     ++
 | ||||
|     // }
 | ||||
|     // else
 | ||||
|     // {
 | ||||
|     //     оновимо
 | ||||
|     // }
 | ||||
|     //return ???;    
 | ||||
|     return i;//target[0]%10;
 | ||||
| } | ||||
| 
 | ||||
| void add_target_capacity(struct station* station,const char* target, int capacity) | ||||
| { | ||||
|     int i=select_track(station, target); | ||||
| 
 | ||||
|     struct car *nwcar = (struct car*)calloc(STATION_SIZE, sizeof(struct car)); | ||||
|     nwcar->next=NULL; | ||||
|     strcpy(nwcar->value, target); | ||||
|     nwcar->capacity=capacity; | ||||
| 
 | ||||
|     if(station->tracks[i]==NULL) | ||||
|     {         | ||||
|         station->tracks[i]=nwcar; | ||||
|     } | ||||
| 
 | ||||
|     struct car* start = station->tracks[i]; | ||||
|     struct car* this = start;     | ||||
|     while(this->next != NULL) | ||||
|     {         | ||||
|         this=this->next; | ||||
|     } | ||||
|     this->next=nwcar; | ||||
| } | ||||
| 
 | ||||
| int get_target_capacity(struct station* station,const char* target) | ||||
| { | ||||
|      int i=select_track(station, target); | ||||
|     struct car* start = station->tracks[i]; | ||||
|     struct car* this = start;     | ||||
|     while(this != NULL) | ||||
|     { | ||||
|         if(strcmp(this->value , target)==0) | ||||
|         { | ||||
|             return this->capacity; | ||||
|         } | ||||
|         this=this->next; | ||||
|     }            | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| int count_targets(struct station* station) | ||||
| { | ||||
|     int k=0; | ||||
|     for (int i = 0 ; i< station->track_count; i++) | ||||
|     { | ||||
|         struct car* start = station->tracks[i]; | ||||
|         struct car* this = start;     | ||||
|         while(this != NULL) | ||||
|         { | ||||
|             k++; | ||||
|             this=this->next; | ||||
|         }        | ||||
|     } | ||||
|     return k; | ||||
| } | ||||
| 
 | ||||
| int count_capacity(struct station* station){ | ||||
|     int k=0; | ||||
| 
 | ||||
|     for (int i = 0 ; i< station->track_count; i++) | ||||
|     { | ||||
|         struct car* start = station->tracks[i]; | ||||
|         struct car* this = start; | ||||
|      | ||||
|         while(this != NULL) | ||||
|         { | ||||
|             k+=this->capacity; | ||||
|             this=this->next; | ||||
|         }        | ||||
|     } | ||||
|     return k; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * Vytvori prazdnu stanicu. | ||||
|  * Alokuje pole smernikov tracks na pociatocnu kapacitu STATION_SIZE | ||||
|  * nastavi velkost capacity na STATION_SIZE | ||||
|  * @return smernik na prazdnu stanicu | ||||
|  */ | ||||
| struct station* create_station(); | ||||
| 
 | ||||
| /**
 | ||||
|  * Uvolni pamat | ||||
|  * @param smernik na databazu | ||||
|  */ | ||||
| void destroy_station(struct station* station); | ||||
| 
 | ||||
| /**
 | ||||
|  * Vyberie poziciu v poli station->tracks pre ulozenie zaznamu target | ||||
|  * | ||||
|  * Proces vyberu by mal splnat kriteria pre hash funkciu: | ||||
|  * - rovnaky retazec by mal vzdy mat rovnaky vysledok | ||||
|  * - pre rozne retazce by mali byt vysledky co najviac rozne | ||||
|  * | ||||
|  * @param smernik na databazu | ||||
|  * @param nazov cielovej stanice | ||||
|  * @return cislo v intervale 0 az N-1, kde N je  station->track_count | ||||
|  */ | ||||
| int select_track(struct station* station, const char* target); | ||||
| 
 | ||||
| /**
 | ||||
|  * Zvysi zaznam o pocte cestujucich do danej cielovej stanice. | ||||
|  * | ||||
|  * Najprv sa vyberie cielova trat pomocou select_track(). Ak zaznam neexistuje,  | ||||
|  * vytvori sa novy. Ak zaznam na danej trati (spojkovom zozname) existuje, cislo sa pripocita. | ||||
|  * V databaze nesmu byt dva zaznamy s rovnakou cielovou stanicou. | ||||
|  * | ||||
|  * @param smernik na databazu | ||||
|  * @param nazov cielovej stanice | ||||
|  */ | ||||
| void add_target_capacity(struct station* station,const char* target, int capacity); | ||||
| 
 | ||||
| /**
 | ||||
|  * Ziska zaznam o cielovej stanici. | ||||
|  * @param smernik na databazu | ||||
|  * @param nazov cielovej stanice | ||||
|  * | ||||
|  * @return kapacitu do cielovej stanice. Ak sa zaznam nenachedza, vrati nula. | ||||
|  */ | ||||
| int get_target_capacity(struct station* station,const char* target); | ||||
| 
 | ||||
| /**
 | ||||
|  * Spocita pocet cielovych stanic | ||||
|  * @param smernik na databazu | ||||
|  */ | ||||
| int count_targets(struct station* station); | ||||
| 
 | ||||
| /**
 | ||||
|  * Spocita kapacitu vo vsetkych zaznamoch | ||||
|  * @param smernik na databazu | ||||
|  */ | ||||
| int count_capacity(struct station* station); | ||||
| #endif | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user