du4
This commit is contained in:
parent
f69ffea873
commit
e45ffc8dfd
16
du4/Makefile
Normal file
16
du4/Makefile
Normal file
@ -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
|
||||
75
du4/a_train.c
Normal file
75
du4/a_train.c
Normal file
@ -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;
|
||||
}
|
||||
28
du4/a_train.h
Normal file
28
du4/a_train.h
Normal file
@ -0,0 +1,28 @@
|
||||
#ifndef A_TRAIN_H
|
||||
#define A_TRAIN_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#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
|
||||
43
du4/main.c
Normal file
43
du4/main.c
Normal file
@ -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;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user