#include #include #include 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 scanf(" %c",&odpoved); if (odpoved == 'a') { spustac (uzol -> lavy); } else if (odpoved == 'n') { spustac (uzol -> pravy); } // uvidim co test ocakava ked dam zle odpoved } void destroy_tree (struct uzol* strom){ destroy_tree(strom -> lavy); destroy_tree(strom -> pravy); free(strom); } int main() { struct uzol* strom = nacitaj_data(); if (!strom) return 0; int listy = zrataj_produkty(strom); printf("Expert z bufetu to vie.\n"); printf("Pozna %d druhov ovocia a zeleniny.\n", listy); printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); spustac(strom); if (strom != NULL) destroy_tree(strom); return 0; }