#include #include #include #define MAXLINE 256 typedef struct TreeNode { char text[MAXLINE]; struct TreeNode *yes_branch; struct TreeNode *no_branch; } TreeNode; static TreeNode* read_tree_node() { char buffer[MAXLINE]; memset(buffer, 0, sizeof(buffer)); char *r = fgets(buffer, sizeof(buffer), stdin); if (r == NULL) { return NULL; } if (buffer[0] == '\n' || buffer[0] == '\r') { return NULL; } TreeNode *node = calloc(1, sizeof(TreeNode)); if (!node) { exit(1); } strncpy(node->text, buffer, MAXLINE - 1); if (node->text[0] == '*') { node->yes_branch = NULL; node->no_branch = NULL; return node; } node->yes_branch = read_tree_node(); node->no_branch = read_tree_node(); return node; } static void free_tree(TreeNode *root) { if (root != NULL) { free_tree(root->yes_branch); free_tree(root->no_branch); free(root); } } static int count_leafs(TreeNode *root) { if (root == NULL) { return 0; } int left = count_leafs(root->yes_branch); int right = count_leafs(root->no_branch); int is_leaf = 0; if (root->yes_branch == NULL && root->no_branch == NULL) { is_leaf = 1; } return left + right + is_leaf; } static int validate_tree(TreeNode *root) { if (root == NULL) { return 0; } int is_answer = (root->text[0] == '*'); if (is_answer) { if (root->yes_branch != NULL || root->no_branch != NULL) { return 0; } return 1; } if (root->yes_branch == NULL || root->no_branch == NULL) { return 0; } return validate_tree(root->yes_branch) && validate_tree(root->no_branch); } static void skip_empty_line() { char temp[MAXLINE]; long pos = ftell(stdin); if (fgets(temp, sizeof(temp), stdin) == NULL) { return; } if (!(temp[0] == '\n' || temp[0] == '\r')) { fseek(stdin, pos, SEEK_SET); } } static void run_dialog(TreeNode *root) { if (root == NULL) { return; } printf("%s", root->text); if (root->yes_branch == NULL && root->no_branch == NULL) { printf("Koniec\n"); return; } char c; int r = scanf(" %c", &c); if (r != 1) { printf("Koniec vstupu\n"); return; } if (c == 'a') { run_dialog(root->yes_branch); return; } if (c == 'n') { run_dialog(root->no_branch); return; } printf("Nerozumiem\n"); } int main() { TreeNode *root = read_tree_node(); skip_empty_line(); printf("Expert z bufetu to vie.\n"); if (root == NULL || !validate_tree(root)) { printf("Chybna databaza\n"); free_tree(root); return 0; } int total = count_leafs(root); printf("Pozna %d druhov ovocia a zeleniny.\n", total); printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); run_dialog(root); free_tree(root); return 0; }