From b00e53a3e4072d4111f14023b75d71bb8f11a8d0 Mon Sep 17 00:00:00 2001 From: mr314ot Date: Thu, 13 Nov 2025 09:02:55 +0100 Subject: [PATCH] du5 --- du5/a_station.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 du5/a_station.c diff --git a/du5/a_station.c b/du5/a_station.c new file mode 100644 index 0000000..75dd870 --- /dev/null +++ b/du5/a_station.c @@ -0,0 +1,120 @@ +#include "a_station.h" +#include +#include +#include + +//vytvorit prazdnu stanicu +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; +} + +//uvolnit vsetku pamat v tabuľke. +void destroy_station(struct station* station) { + if (station == NULL) return; + + //prejdi vsetky trate + for (int i = 0; i < station->track_count; i++) { + struct car* current = station->tracks[i]; + //prejdi vsetky zaznamy na trati a uvolni ich + while (current != NULL) { + struct car* next = current->next; + free(current); + current = next; + } + } + + //uvolni pole smernikov a stanicu + free(station->tracks); + free(station); +} + +int select_track(struct station* station, const char* target) { + unsigned long hash = 5381; + int c; + while ((c = *target++)) + hash = ((hash << 5) + hash) + c; + return (int)(hash % station->track_count); +} + +//prida alebo aktualizuje zaznam v stanici +void add_target_capacity(struct station* station, const char* target, int capacity) { + if (station == NULL || target == NULL) return; + + int track = select_track(station, target); + struct car* current = station->tracks[track]; + struct car* prev = NULL; + + //prehladavanie spojkoveho zoznamu na trati + while (current != NULL) { + if (strcmp(current->value, target) == 0) { + //zvysit kapacitu ak stanica existuje + current->capacity += capacity; + return; + } + prev = current; + current = current->next; + } + + //novy zaznam ak neexistuje + struct car* new_car = (struct car*)calloc(1, sizeof(struct car)); + strncpy(new_car->value, target, TARGET_SIZE - 1); + new_car->value[TARGET_SIZE - 1] = '\0'; + new_car->capacity = capacity; + new_car->next = NULL; + + if (prev == NULL) { + station->tracks[track] = new_car; + } else { + prev->next = new_car; + } +} + +//vyhladat kapacitu pre zadanu cielovu stanicu +int get_target_capacity(struct station* station, const char* target) { + if (station == NULL || target == NULL) return 0; + + int track = select_track(station, target); + struct car* current = station->tracks[track]; + + while (current != NULL) { + if (strcmp(current->value, target) == 0) + return current->capacity; + current = current->next; + } + return 0; //nenaslo +} + +//spocitat pocet roznych cielovych stanic +int count_targets(struct station* station) { + if (station == NULL) return 0; + int count = 0; + + for (int i = 0; i < station->track_count; i++) { + struct car* current = station->tracks[i]; + while (current != NULL) { + count++; + current = current->next; + } + } + + return count; +} + +//spocitat celkovu kapacitu vsetkych zaznamov +int count_capacity(struct station* station) { + if (station == NULL) return 0; + int total = 0; + + for (int i = 0; i < station->track_count; i++) { + struct car* current = station->tracks[i]; + while (current != NULL) { + total += current->capacity; + current = current->next; + } + } + + return total; +}