93 lines
2.6 KiB
C
93 lines
2.6 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
|
|
struct uzol { //zakladna struktura, kam nahram otazky a referencie
|
|
char otazka[100];
|
|
struct uzol *lavy;
|
|
struct uzol *pravy;
|
|
};
|
|
|
|
struct uzol* nacitaj_data() { // todo, rekurzivne pomazat z pamate
|
|
|
|
char riadok[100]; // o velkosti otazky alebo ovocia
|
|
if (!fgets(riadok, 100, stdin)) return NULL; // ak nahram NULL
|
|
if (riadok[0] == '\n') return NULL; // ak vyenterujem input
|
|
|
|
// mozno bude treba osetrit ak by bol namiesto otazky rovno produkt, prv ocakavam otazku
|
|
|
|
struct uzol* uzol = malloc (sizeof(struct uzol)); // alokujem pre kazdy novy uzol binarneho stromu
|
|
|
|
strcpy (uzol -> otazka, riadok); // nakopcim stdin do textoveho pola struktury
|
|
|
|
//kontrola hviezdicky, ak najdem, nepokracujem v strome tym smerom
|
|
if (riadok[0] == '*') {
|
|
uzol -> lavy = NULL;
|
|
uzol -> pravy = NULL;
|
|
} else { // rekurzivne nacitam najprv lavy koren, potom pravy ak to bola otazka
|
|
uzol -> lavy = nacitaj_data();
|
|
uzol -> pravy = nacitaj_data();
|
|
}
|
|
return uzol; // vyplneny strom
|
|
}
|
|
|
|
int zrataj_produkty(struct uzol* uzol) {
|
|
if (uzol == NULL) return 0; // ak je NULL, vratim nic
|
|
if (uzol -> pravy == NULL && uzol -> lavy == NULL) return 1; //ak nemam pokracovanie ale existujem, vratim 1
|
|
return zrataj_produkty(uzol -> pravy) + zrataj_produkty(uzol -> lavy); // pozbieram existencne jednotky
|
|
}
|
|
|
|
void spustac(struct uzol* uzol) {
|
|
if (uzol == NULL) return; // ak nemam strom koncim
|
|
printf ("%s",uzol -> otazka); // vypisem content textu struktury
|
|
|
|
if (uzol -> pravy == NULL && uzol -> lavy == NULL) { // ak nema pokracovanie, napisem ze nema pokracovanie
|
|
printf ("Koniec\n");
|
|
return;
|
|
}
|
|
|
|
char odpoved; // iacitavam a/n
|
|
if (scanf(" %c",&odpoved) != 1) { // ak mi nenacita hodnotu
|
|
printf ("Koniec vstupu\n");
|
|
return;
|
|
}
|
|
|
|
if (odpoved == 'a') {
|
|
spustac (uzol -> lavy);
|
|
} else if (odpoved == 'n') {
|
|
spustac (uzol -> pravy);
|
|
} else {
|
|
printf ("Nerozumiem\n");
|
|
}
|
|
}
|
|
|
|
void destroy_tree (struct uzol* strom){
|
|
if (strom == NULL) return;
|
|
destroy_tree(strom -> lavy);
|
|
destroy_tree(strom -> pravy);
|
|
free(strom);
|
|
}
|
|
|
|
int main() {
|
|
|
|
struct uzol* strom = nacitaj_data();
|
|
|
|
printf("Expert z bufetu to vie.\n");
|
|
|
|
if (!strom) {
|
|
printf("Chybna databaza\n");
|
|
return 0;
|
|
}
|
|
|
|
int listy = zrataj_produkty(strom);
|
|
|
|
printf("Pozna %d druhov ovocia a zeleniny.\n", listy);
|
|
printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n");
|
|
|
|
spustac(strom);
|
|
|
|
destroy_tree(strom);
|
|
|
|
return 0;
|
|
} |