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 | struct station* create_station(){ | ||||||
| #define STATION_H |    struct station* station = (struct station*)calloc(1,sizeof(struct station)); | ||||||
| // Pocet trati k dispozicii
 |    station->tracks = (struct car**)calloc(STATION_SIZE, sizeof(struct car*)); | ||||||
| #define STATION_SIZE 10 |    station->track_count = STATION_SIZE; | ||||||
| // Maximalny pocet znakov pre ulozenie nazvu cielovej stanice
 |    return station; | ||||||
| #define TARGET_SIZE 36 | } | ||||||
| 
 | 
 | ||||||
| /**
 | void destroy_station(struct station* station){ | ||||||
|  * Jeden zaznam o kapacite do cielovej stanice |     free(station->tracks); | ||||||
|  */ |     free(station); | ||||||
| struct car { | } | ||||||
|     // Cielova stanica / nazov
 |  | ||||||
|     char value[TARGET_SIZE]; |  | ||||||
|     // Pocet cestujuchich
 |  | ||||||
|     int capacity; |  | ||||||
|     // Smernik na dalsi zaznam
 |  | ||||||
|     struct car* next; |  | ||||||
| }; |  | ||||||
| 
 | 
 | ||||||
| /**
 | int select_track(struct station* station, const char* target) | ||||||
|  * Cela databaza zaznamov | { | ||||||
|  */ |     int i=0; | ||||||
| struct station { |     char t=0; | ||||||
|     // Dynamicke pole smernikov na zaznamy
 |     while(target[i]!=0) | ||||||
|     // jeden zaznam ma typ struct car*
 |     { | ||||||
|     struct car** tracks; |       t+=target[i]; // або інша хеш функція 
 | ||||||
|     // Velkost pola tracks
 |     } | ||||||
|     int track_count; |     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