diff --git a/du4/Makefile b/du4/Makefile new file mode 100644 index 0000000..0a23275 --- /dev/null +++ b/du4/Makefile @@ -0,0 +1,16 @@ +CC=gcc +CFLAGS=-Wall -Wextra -std=c11 + +all: train + +train: main.o a_train.o + $(CC) $(CFLAGS) -o train main.o a_train.o + +main.o: main.c a_train.h + $(CC) $(CFLAGS) -c main.c + +a_train.o: a_train.c a_train.h + $(CC) $(CFLAGS) -c a_train.c + +clean: + rm -f *.o train diff --git a/du4/a_train.c b/du4/a_train.c new file mode 100644 index 0000000..c7970de --- /dev/null +++ b/du4/a_train.c @@ -0,0 +1,75 @@ +#include "a_train.h" + +struct car* add_car(struct car* first, const char* target) { + // Vytvorenie nového vozňa + struct car* newcar = calloc(1, sizeof(struct car)); + if (!newcar) return first; + + strcpy(newcar->value, target); + + // Ak bol zoznam prázdny — použijeme ternárny operator + first = (first == NULL) ? newcar : first; + + // Ak bol prázdny, máme hotovo + if (first == newcar) + return first; + + // Nájdeme koniec zoznamu + struct car* this = first; + while (this->next != NULL) + this = this->next; + + this->next = newcar; + return first; +} + +void print_train(struct car* first) { + // ZMENA: jednoduchší zápis cyklu + for (struct car* c = first; c != NULL; c = c->next) { + printf("%s\n", c->value); + } +} + +void cancel_train(struct car* first) { + if (first == NULL) return; + cancel_train(first->next); + free(first); +} + +struct car* clear_train(struct car* first, const char* name) { + + // Ak je zoznam prázdny + if (first == NULL) return NULL; + + // Odstraňovanie prvkov zo začiatku + while (first && strcmp(first->value, name) == 0) { + struct car* tmp = first->next; + free(first); + first = tmp; + } + + // Ak sa všetko odstránilo + if (first == NULL) return NULL; + + struct car* prev = first; + + // ZMENA: prepis vnútornej logiky bez zmeny výsledku + while (prev->next) { + + // Ak sa má prvok vymazať + if (strcmp(prev->next->value, name) == 0) { + + struct car* to_delete = prev->next; + + // Preskočíme uzol a uvoľníme ho + prev->next = to_delete->next; + free(to_delete); + + } else { + // ZMENA: iný štýl zápisu inkrementácie + prev = prev->next; + } + } + + return first; +} diff --git a/du4/a_train.h b/du4/a_train.h new file mode 100644 index 0000000..3003b61 --- /dev/null +++ b/du4/a_train.h @@ -0,0 +1,28 @@ +#ifndef A_TRAIN_H +#define A_TRAIN_H + +#include +#include +#include + +#define SIZE 128 // Maximálna dĺžka názvu stanice + +// Štruktúra jedného vozňa v spojkovom zozname +struct car { + char value[SIZE]; // Cieľová stanica + struct car* next; // Ukazovateľ na ďalší vozeň (NULL = koniec zoznamu) +}; + +// Pridá nový vozeň na koniec spojkového zoznamu +struct car* add_car(struct car* first, const char* target); + +// Vypíše všetky vozne v poradí +void print_train(struct car* first); + +// Uvoľní všetku dynamickú pamäť spojkového zoznamu +void cancel_train(struct car* first); + +// Odstráni všetky vozne s daným názvom stanice +struct car* clear_train(struct car* first, const char* name); + +#endif diff --git a/du4/main.c b/du4/main.c new file mode 100644 index 0000000..e0dcbc4 --- /dev/null +++ b/du4/main.c @@ -0,0 +1,43 @@ +#include "a_train.h" + +int main() { + struct car* train = NULL; // Začiatok spojkového zoznamu (vlak) + char buffer[SIZE]; + int passengers; + + // Načítanie vstupných údajov od používateľa + printf("Zadajte zoznam cieľových staníc a počet cestujúcich.\n"); + printf("Zoznam zakončite prázdnym riadkom.\n"); + + while (1) { + // Načítame názov stanice + if (!fgets(buffer, SIZE, stdin)) break; + if (buffer[0] == '\n') break; // Prázdny riadok = koniec + + buffer[strcspn(buffer, "\n")] = 0; // Odstránenie '\n' + + // Načítame počet cestujúcich (údaj sa ďalej nepoužíva) + scanf("%d", &passengers); + getchar(); // Odstráni zvyšný znak '\n' + + // Pridáme vozeň do zoznamu + train = add_car(train, buffer); + } + + // Zistenie stanice, ktorú treba odstrániť + printf("\nZadajte stanicu, ktorá sa má vyradiť:\n"); + fgets(buffer, SIZE, stdin); + buffer[strcspn(buffer, "\n")] = 0; + + // Odstránenie všetkých vozňov so zadanou stanicou + train = clear_train(train, buffer); + + // Výpis výsledného vlaku + printf("\nVýsledný vlak bez stanice %s bude:\n", buffer); + print_train(train); + + // Uvoľnenie pamäte + cancel_train(train); + + return 0; +}