diff --git a/du6/program.c b/du6/program.c index ddcae3e..f144f8f 100644 --- a/du6/program.c +++ b/du6/program.c @@ -10,23 +10,15 @@ typedef struct tree { struct tree *right; } Tree; -int valid_db = 1; +int valid_db = 1; // flag pre validitu databazy -//odstranit koncovy znak +// odstranit koncovy znak \n void strip_newline(char *s) { int len = strlen(s); if (len > 0 && s[len-1] == '\n') s[len-1] = '\0'; } -// uvolnenie pamate -void destroy_tree(Tree *t) { - if (!t) return; - destroy_tree(t->left); - destroy_tree(t->right); - free(t); -} - // rekurzivne nacitanie stromu v preorder Tree* read_tree() { char buffer[SIZE]; @@ -34,7 +26,6 @@ Tree* read_tree() { if (!fgets(buffer, SIZE, stdin)) return NULL; - // prazdny riadok -> koniec if (strcmp(buffer, "\n") == 0) return NULL; @@ -45,35 +36,38 @@ Tree* read_tree() { strcpy(node->value, buffer); - // odpoved -> list + // list if (buffer[0] == '*') { return node; } - // inak nacitat oboch potomkov + // očakávame presne 2 potomkov node->left = read_tree(); - node->right = read_tree(); - - if (!node->left || !node->right) { - valid_db = 0; - destroy_tree(node->left); - destroy_tree(node->right); - free(node); - return NULL; + if (!node->left) { + valid_db = 0; + free(node); + return NULL; } - long cur = ftell(stdin); - if (fgets(buffer, SIZE, stdin)) { - if (strcmp(buffer, "\n") != 0 && buffer[0] != '*') { - valid_db = 0; - } else { - fseek(stdin, cur, SEEK_SET); - } + node->right = read_tree(); + if (!node->right) { + valid_db = 0; + destroy_tree(node->left); + free(node); + return NULL; } return node; } +// uvolnenie pamate +void destroy_tree(Tree *t) { + if (!t) return; + destroy_tree(t->left); + destroy_tree(t->right); + free(t); +} + // pocet listov = pocet tovarov int count_leaves(Tree *t) { if (!t) return 0; @@ -90,19 +84,15 @@ void run_system(Tree *node) { // list -> koniec if (!node->left && !node->right) { - printf("Koniec\n"); + printf("Koniec\n"); return; } - int c; - - do { - c = getchar(); - if (c == EOF) { - printf("Koniec vstupu\n"); - return; - } - } while (c=='\n' || c=='\r' || c==' ' || c=='\t'); + char c; + if (scanf(" %c", &c) != 1) { + printf("Nerozumiem\n"); + return; + } if (c == 'a') { run_system(node->left); @@ -116,14 +106,14 @@ void run_system(Tree *node) { int main() { Tree *root = read_tree(); - // nepodarilo sa nacitat koren -> chyba + // kontrola prázdneho alebo chybného stromu if (!root || !valid_db) { printf("Expert z bufetu to vie.\n"); - printf("Chybna databaza\n"); + printf("Chybna databaza\n"); return 0; } - // skontrolovat prazdny riadok + // skontrolovat prazdny riadok po databaze char buffer[SIZE]; if (!fgets(buffer, SIZE, stdin) || strcmp(buffer, "\n") != 0) { printf("Koniec vstupu\n");