diff --git a/cv4/Makefile b/cv4/Makefile new file mode 100644 index 0000000..3c2c463 --- /dev/null +++ b/cv4/Makefile @@ -0,0 +1,13 @@ +CFLAGS= -std=c99 -g -Wall + +all: train + +%.o: %.c + gcc -c -o $@ $< $(CFLAGS) + +train: main.o a_train.o + gcc main.o a_train.o -o train + +clean: + rm *.o train + diff --git a/cv4/a_train.c b/cv4/a_train.c new file mode 100644 index 0000000..7041f71 --- /dev/null +++ b/cv4/a_train.c @@ -0,0 +1,91 @@ +#include "a_train.h" +#include +#include +#include + +struct car* add_car(struct car* first,const char* target) +{ + struct car* newcar = calloc(1,sizeof(struct car)); + strcpy(newcar->value, target); + + if(first == NULL) + { + return newcar; + } + + struct car* this = first; + + while(this->next != NULL) + { + this = this->next; + } + + this->next = newcar; + + return first; +} + +void print_train(struct car* first) +{ + if(first == NULL) + { + return; + } + struct car* this = first; + + while(this->next != NULL) + { + printf("%s\n", this->value); + this = this->next; + } + printf("%s\n", this->value); +} + +void cancel_train(struct car* first) +{ + if(first == NULL) + { + return; + } + struct car* this = first; + if(this->next != NULL) + { + cancel_train(this->next); + } + free(first); +} + + +struct car* clear_train(struct car* first, const char* target) +{ + if(first == NULL) + { + return NULL; + } + if(first->next == NULL) + { + if(strcmp(first->value, target)) + { + free(first); + return NULL; + } + else + { + return first; + } + } + struct car* prev = first; + while (prev->next->next != NULL) + { + if(strcmp(prev->value, target)) + { + struct car* third = prev->next->next; + free(prev->next); + prev->next = third; + return first; + } + prev = prev->next; + } + return first; +} + diff --git a/cv4/a_train.h b/cv4/a_train.h new file mode 100644 index 0000000..5982bfe --- /dev/null +++ b/cv4/a_train.h @@ -0,0 +1,51 @@ +#ifndef TRAIN_H +#define TRAIN_H +#define SIZE 100 + +/** + * Jeden vozen vlaku + */ +struct car { + /** + * Nazov cielovej stanice + */ + char value[SIZE]; + /** + * Smenik na dalsi vozen + */ + struct car* next; +}; + +/** + * Prida vozen na koniec vlaku. + * + * @arg nazov cielovej stanice, ktory sa ma priradit novemu voznu. + * @return smernik na zaciatok vlaku. + */ +struct car* add_car(struct car* first,const char* target); + + +/** + * Vypise vsetky vozne vo vlaku + * + * @arg smernik na prvy vozen + */ +void print_train(struct car* first); + +/** + * Zrusenie vsetkych voznov vo vlaku. + * @arg smernik na prvy vozen + */ +void cancel_train(struct car* first); + +/** + * Vyradenie vsetkych voznov, ktorych cielova stanica je target + * + * @arg smernik na prvy vozen + * @arg cielova stanica, ktora sa ma vyradit z vlaku. + * @return smernik na novy prvy vozen + * + */ +struct car* clear_train(struct car* first,const char* target); + +#endif // TRAIN_H diff --git a/cv4/main.c b/cv4/main.c new file mode 100644 index 0000000..d054eb1 --- /dev/null +++ b/cv4/main.c @@ -0,0 +1,32 @@ +#include "a_train.h" +#include +#include + +int main() +{ + char buf[50]; + struct car* train = NULL; + memset(buf, 0, 50); + printf("Zadajte zoznam cieľových staníc.\nZoznam zakončite prázdnym riadkom.\n"); + while (fgets(buf, 50, stdin) != NULL) + { + if(buf[0] == '\n') + { + break; + } + buf[strcspn(buf, "\n")] = '\0'; + train = add_car(train,buf); + } + + print_train(train); + + printf("Zadajte stanicu, ktorá sa má vyradiť:\n"); + scanf("%s", buf); + clear_train(train,buf); + + print_train(train); + + cancel_train(train); + + return 0; +}