diff --git a/cv6/Makefile b/cv6/Makefile new file mode 100644 index 0000000..0f53ca0 --- /dev/null +++ b/cv6/Makefile @@ -0,0 +1,17 @@ +CC = gcc +CFLAGS = -Wall -Werror -std=c99 + +all: main + +main: main.o a_station.o + $(CC) $(CFLAGS) -o main main.o a_station.o + +main.o: main.c a_station.h + $(CC) $(CFLAGS) -c main.c + +a_station.o: a_station.c a_station.h + $(CC) $(CFLAGS) -c a_station.c + +clean: + rm -f *.o main + diff --git a/cv6/a_station.c b/cv6/a_station.c new file mode 100644 index 0000000..ef739e1 --- /dev/null +++ b/cv6/a_station.c @@ -0,0 +1,90 @@ +#include +#include +#include "a_station.h" + +struct station* create_station() { + struct station* new_station = malloc(sizeof(struct station)); + if (!new_station) return NULL; + + new_station->tracks = calloc(STATION_SIZE, sizeof(struct car*)); + new_station->track_count = STATION_SIZE; + return new_station; +} + +void destroy_station(struct station* station) { + for (int i = 0; i < station->track_count; i++) { + struct car* current = station->tracks[i]; + while (current) { + struct car* temp = current; + current = current->next; + free(temp); + } + } + free(station->tracks); + free(station); +} + +int select_track(struct station* station, const char* target) { + int hash = 0; + for (int i = 0; target[i] != '\0'; i++) { + hash = (hash * 31 + target[i]) % station->track_count; + } + return hash; +} + +void add_target_capacity(struct station* station, const char* target, int capacity) { + int index = select_track(station, target); + struct car* current = station->tracks[index]; + + while (current) { + if (strcmp(current->value, target) == 0) { + current->capacity += capacity; + return; + } + current = current->next; + } + + struct car* new_car = malloc(sizeof(struct car)); + strncpy(new_car->value, target, TARGET_SIZE); + 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) { + if (strcmp(current->value, target) == 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) { + count++; + current = current->next; + } + } + return count; +} + +int count_capacity(struct station* station) { + int total_capacity = 0; + for (int i = 0; i < station->track_count; i++) { + struct car* current = station->tracks[i]; + while (current) { + total_capacity += current->capacity; + current = current->next; + } + } + return total_capacity; +} + diff --git a/cv6/a_station.h b/cv6/a_station.h new file mode 100644 index 0000000..ce8c733 --- /dev/null +++ b/cv6/a_station.h @@ -0,0 +1,91 @@ +#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 + +/** + * 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; +}; + +/** + * 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; +}; + + +/** + * 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 diff --git a/cv6/main.c b/cv6/main.c new file mode 100644 index 0000000..e20ff9c --- /dev/null +++ b/cv6/main.c @@ -0,0 +1,18 @@ +#include +#include "a_station.h" + +int main() { + struct station* station = create_station(); + + add_target_capacity(station, "Bratislava", 100); + add_target_capacity(station, "Kosice", 150); + add_target_capacity(station, "Bratislava", 50); + + printf("Capacity to Bratislava: %d\n", get_target_capacity(station, "Bratislava")); + printf("Total number of targets: %d\n", count_targets(station)); + printf("Total capacity: %d\n", count_capacity(station)); + + destroy_station(station); + return 0; +} +