#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 == NULL) { 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 = count_leafs(root->yes_branch); int right_count = count_leafs(root->no_branch); int is_leaf = 0; if (root->yes_branch == NULL && root->no_branch == NULL) { is_leaf = 1; } return left_count + right_count + is_leaf; } 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 = 0; 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) { printf("Chybna databaza\n"); return 0; } int total_types = count_leafs(root); printf("Pozna %d druhov ovocia a zeleniny.\n", total_types); printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n"); run_dialog(root); free_tree(root); return 0; }