diff --git a/cv8/program.c b/cv8/program.c index 4401d00..cabde94 100644 --- a/cv8/program.c +++ b/cv8/program.c @@ -12,8 +12,9 @@ struct tree { struct tree* read_tree(int* counter){ - + //read one node int* c = counter; + //printf("%d\n", *c); char buffer[50]; memset(buffer,0,50); @@ -25,25 +26,40 @@ struct tree* read_tree(int* counter){ printf("Chybna databaza\n"); exit(0); } - + + if(buffer[0] != '\0'){ struct tree* node = calloc(1,sizeof(struct tree)); memcpy(node->value, buffer,50); + + //count all nodes *c += 1; counter = c; + + //until i find "*", recursively read tree if(buffer[0] != '*'){ + + //first check left side, if the isn't node, add it if(node->left == NULL){ node->left = read_tree(counter); } + + //than check right side if(node->right == NULL){ node->right = read_tree(counter); } } + + //if i found root with left and right node, decrease my counter if(node->left != NULL && node->right != NULL){ *c -= 2; counter = c; } + + //if binary tree is okay, than counter is 1(there is one root) if(*c == 1){ + + //if the user still inseting, than the databaze wrong r = fgets(buffer,50, stdin); int x = strlen(buffer); buffer[x-1]='\0'; @@ -59,35 +75,38 @@ struct tree* read_tree(int* counter){ } void search(struct tree* this){ - - char buffer[5]; - memset(buffer,0,5); - char* r = fgets(buffer,5,stdin); + //read answer + char answer[5]; + memset(answer,0,5); + char* r = fgets(answer,5,stdin); if(r == NULL){ printf("Koniec vstupu\n"); exit(0); } - if(buffer[0] == '\n'){ + + if(answer[0] == '\n'){ search(this); } - /*if(buffer[0] != 'a' || buffer[0] != 'n' || buffer[0] != '\n'){ - printf("Nerozumiem\n"); - exit(0); - }*/ - - if(buffer[0] == 'a'){ - if(this->left->value[0] == '*'){ + + if(answer[0] == 'a'){ + + //if left node is answer, print it and end the program + if(this->left->value[0] == '*'){ printf("%s\n", this->left->value); printf("Koniec\n"); exit(0); } + + //else print it and continue searching printf("%s\n", this->left->value); search(this->left); } - - else if(buffer[0] == 'n'){ + + else if(answer[0] == 'n'){ + + //the same for the right side if(this->right->value[0] == '*'){ printf("%s\n", this->right->value); printf("Koniec\n"); @@ -98,26 +117,19 @@ void search(struct tree* this){ } else{ + + //if input is wrong printf("Nerozumiem\n"); exit(0); } } -void print_tree(struct tree* tree,int offset){ - int i; - for (i = 0; i < offset; i++){ - printf(" "); - } - printf("%s",tree->value); - if (tree->left){ - print_tree(tree->left,offset +3); - print_tree(tree->right,offset +3); - } -} - void destroy_tree(struct tree* root){ + + //if root is NULL,than tree is empty if(root == NULL) return; + //go to the left side and than to the right destroy_tree(root->left); destroy_tree(root->right); free(root); @@ -125,10 +137,14 @@ void destroy_tree(struct tree* root){ } int count_leaves(struct tree* node){ int count = 0; + + //if left and right nodes are empty if(node->left == NULL && node->right == NULL){ - count = 1; + count++;; } else{ + + //if left isn't NULL than count if(node->left != NULL){ count += count_leaves(node->left); } @@ -143,13 +159,14 @@ int count_all(struct tree* node){ if(node == NULL){ return 0; } - int count = 1; + int count = 0; if(node->left != NULL){ count += count_all(node->left); } if(node->right != NULL){ count += count_all(node->right); } + count++; return count; }