From 0e74369742cd70ab391df333559db45b56bdfd6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Dembick=C3=BD?= Date: Tue, 21 Apr 2026 06:23:25 +0000 Subject: [PATCH] =?UTF-8?q?P=C5=99idat=20=20du6/a=5Fstation.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- du6/a_station.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 du6/a_station.c diff --git a/ du6/a_station.c b/ du6/a_station.c new file mode 100644 index 0000000..8297e13 --- /dev/null +++ b/ du6/a_station.c @@ -0,0 +1,92 @@ +#include "a_station.h" +#include +#include + +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; +} + +void destroy_station(struct station* station) { + if (station == NULL) return; + for (int i = 0; i < station->track_count; i++) { + struct car* current = station->tracks[i]; + while (current != NULL) { + struct car* next = current->next; + free(current); + current = next; + } + } + free(station->tracks); + free(station); +} + +int select_track(struct station* station, const char* target) { + unsigned long hash = 5381; + int c; + while ((c = (unsigned char)*target++)) { + hash = ((hash << 5) + hash) + c; // hash * 33 + c + } + return (int)(hash % (unsigned long)station->track_count); +} + +void add_target_capacity(struct station* station, const char* target, int capacity) { + int index = select_track(station, target); + struct car* current = station->tracks[index]; + + // Hladame existujuci zaznam + while (current != NULL) { + if (strncmp(current->value, target, TARGET_SIZE) == 0) { + current->capacity += capacity; + return; + } + current = current->next; + } + + // Zaznam neexistuje - vytvorime novy na zaciatku zoznamu + 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 = station->tracks[index]; + station->tracks[index] = new_car; +} + +int get_target_capacity(struct station* station, const char* target) { + int index = select_track(station, target); + struct car* current = station->tracks[index]; + + while (current != NULL) { + if (strncmp(current->value, target, TARGET_SIZE) == 0) { + return current->capacity; + } + current = current->next; + } + return 0; +} + +int count_targets(struct station* station) { + 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; +} + +int count_capacity(struct station* station) { + 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; +} \ No newline at end of file