diff --git a/du5/program.c b/du5/program.c index 8ed5ff0..7ded7a7 100644 --- a/du5/program.c +++ b/du5/program.c @@ -11,21 +11,22 @@ typedef struct Tree { struct Tree *no; } Tree; -// читання дерева +// читання дерева у preorder Tree* readTree() { char line[SIZE]; if (fgets(line, SIZE, stdin) == NULL) return NULL; - // якщо пустий рядок → кінець бази + // кінець дерева = порожній рядок + if (strcmp(line, "\n") == 0) return NULL; + + // прибрати \n і \r line[strcspn(line, "\r\n")] = 0; - if (line[0] == '\0') return NULL; Tree *node = malloc(sizeof(Tree)); node->yes = NULL; node->no = NULL; - if (line[0] == '*') { node->isAnswer = 1; @@ -36,37 +37,32 @@ Tree* readTree() { node->isAnswer = 0; strcpy(node->text, line); - node->yes = readTree(); // a - node->no = readTree(); // n + node->yes = readTree(); + node->no = readTree(); } return node; } -// перевірка що після дерева є пустий рядок +// перевірка пустого рядка після дерева int EmptyLine() { char line[SIZE]; if (fgets(line, SIZE, stdin) == NULL) return 0; - if (strcmp(line, "\n") == 0) return 1; - - return 0; + return strcmp(line, "\n") == 0; } -// рахуємо відповіді (листи) +// підрахунок листів int Leaves(Tree *node) { - if (node == NULL) return 0; - + if (!node) return 0; if (node->isAnswer) return 1; - return Leaves(node->yes) + Leaves(node->no); } -// звільнення памʼяті +// звільнення пам’яті void freeTree(Tree *node) { - if (node == NULL) return; - + if (!node) return; freeTree(node->yes); freeTree(node->no); free(node); @@ -74,31 +70,33 @@ void freeTree(Tree *node) { // запуск системи void start(Tree *node) { - char input[10]; - - while (node != NULL) { - if (node->isAnswer) { - printf("* %s\n", node->text); - printf("Koniec\n"); - return; - } + char input[SIZE]; + while (node && !node->isAnswer) { printf("%s\n", node->text); - if (fgets(input, 10, stdin) == NULL) { - printf("Koniec\n"); + if (fgets(input, SIZE, stdin) == NULL) { + printf("Nespravny vstup\n"); return; } - if (input[0] == 'a') { + int i = 0; + while (input[i] == ' ' || input[i] == '\t') i++; + + if (input[i] == 'a') { node = node->yes; - } else if (input[0] == 'n') { + } else if (input[i] == 'n') { node = node->no; } else { - printf("Nerozumiem\n"); + printf("Nespravny vstup\n"); return; } } + + if (node && node->isAnswer) { + printf("*%s\n", node->text); + printf("Koniec\n"); + } } int main() { @@ -106,13 +104,16 @@ int main() { Tree *root = readTree(); - // перевірка чи дерево існує - if (root == NULL) { + if (!root) { printf("Chyba nacitania\n"); return 0; } - + if (!EmptyLine()) { + printf("Chyba nacitania\n"); + freeTree(root); + return 0; + } int count = Leaves(root);