#include "a_station.h" #include #include // Vytvorí štruktúru stanice struct station* create_station() { struct station* station = (struct station*)calloc(1, sizeof(struct station)); // Alokuje pamäť pre stanicu station->tracks = (struct car**)calloc(STATION_SIZE, sizeof(struct car*)); // Alokuje pamäť pre pole koľají station->track_count = STATION_SIZE; // Nastaví počet koľají return station; // Vráti ukazovateľ na stanicu } // Zničí štruktúru stanice (zatiaľ prázdna implementácia) void destroy_station(struct station* station) { // Tu by malo byť uvoľnenie pamäte pre všetky objekty a pole } // Vypočíta index koľaje pre daný cieľ pomocou hashovacej funkcie int select_track(struct station* station, const char* target) { unsigned long hash = 5381; // Inicializuje hash hodnotu int c; while ((c = *target++)) { // Prechádza každým znakom reťazca hash = ((hash << 5) + hash) + c; // hash * 33 + c } return hash % station->track_count; // Vráti index v rozsahu počtu koľají } // Pridá kapacitu cieľu alebo vytvorí nový cieľ void add_target_capacity(struct station* station, const char* target, int capacity) { int index = select_track(station, target); // Získa index koľaje pre cieľ struct car* current = station->tracks[index]; // Získa zoznam cieľov na danej koľaji while (current) { // Prechádza zoznam cieľov if (strcmp(current->value, target) == 0) { // Ak cieľ už existuje current->capacity += capacity; // Zvýši jeho kapacitu return; // Ukončí funkciu } current = current->next; // Pokračuje na ďalší prvok v zozname } struct car* new_car = (struct car*)malloc(sizeof(struct car)); // Alokuje pamäť pre nový cieľ strncpy(new_car->value, target, TARGET_SIZE - 1); // Nastaví názov cieľa new_car->value[TARGET_SIZE - 1] = '\0'; // Ukončí reťazec nulou new_car->capacity = capacity; // Nastaví kapacitu cieľa new_car->next = station->tracks[index]; // Pridá cieľ na začiatok zoznamu station->tracks[index] = new_car; // Uloží nový cieľ do koľaje } // Vráti kapacitu cieľa podľa názvu int get_target_capacity(struct station* station, const char* target) { int index = select_track(station, target); // Získa index koľaje pre cieľ struct car* current = station->tracks[index]; // Získa zoznam cieľov na danej koľaji while (current) { // Prechádza zoznam cieľov if (strcmp(current->value, target) == 0) { // Ak nájde cieľ return current->capacity; // Vráti jeho kapacitu } current = current->next; // Pokračuje na ďalší prvok } return 0; // Ak cieľ neexistuje, vráti 0 } // Počíta počet cieľov vo všetkých koľajach int count_targets(struct station* station) { int count = 0; // Inicializuje počet na 0 for (int i = 0; i < station->track_count; ++i) { // Prechádza všetky koľaje struct car* current = station->tracks[i]; // Získa zoznam cieľov na koľaji while (current) { // Prechádza každý cieľ ++count; // Zvyšuje počet current = current->next; // Pokračuje na ďalší prvok } } return count; // Vráti celkový počet cieľov } // Počíta celkovú kapacitu vo všetkých koľajach int count_capacity(struct station* station) { int total_capacity = 0; // Inicializuje celkovú kapacitu na 0 for (int i = 0; i < station->track_count; ++i) { // Prechádza všetky koľaje struct car* current = station->tracks[i]; // Získa zoznam cieľov na koľaji while (current) { // Prechádza každý cieľ total_capacity += current->capacity; // Pridá jeho kapacitu current = current->next; // Pokračuje na ďalší prvok } } return total_capacity; // Vráti celkovú kapacitu }