#c #recursion #insert #binary-search-tree #function-definition
Вопрос:
по какой-то причине мой корневой узел постоянно остается пустым, и к нему ничего не добавляется. Я не уверен, почему, и мне было интересно, может ли кто-нибудь подсказать мне, что я делаю неправильно. Я пытаюсь прочитать файл и выполнить различные действия для каждого слова в зависимости от числа, которое я получаю. Если это 1, я пытаюсь вставить слово в двоичное дерево, если только оно не является дубликатом, и в этом случае я пытаюсь увеличить частоту на 1. Если это 2, я хочу иметь возможность распечатать глубину и количество раз, когда появляется слово. В конце концов, я хочу отобразить слова в зависимости от наиболее частых к наименее. Часть, на которой я застрял сейчас, заключается в том, что корневой узел всегда остается НУЛЕВЫМ, поэтому я не могу построить свое дерево, я также не знаю, в чем на самом деле проблема.
#include lt;stdio.hgt; #include lt;stdlib.hgt; #include lt;string.hgt; #define MAXSIZE 50 typedef struct node { int depth; int frequency; struct node *left, *right; char word[MAXSIZE]; } node; node* insert(node* root, char newWord[MAXSIZE]) { node *temp; printf("insert Function is being calledn %sn", newWord); if(root == NULL) { temp = (node*) malloc(sizeof(node)); temp-gt;frequency = 1; temp-gt;depth = 1; temp-gt;left = NULL; temp-gt;right = NULL; strcpy(temp-gt;word, newWord); root = temp; printf("You should only recieve this message once.n"); } else if(strcmp(newWord, root-gt;word)lt;0) { printf("Word being added towards leftn"); insert(root-gt;left, newWord); root-gt;depth =1; } else if(strcmp(newWord, root-gt;word)gt;0) { insert(root-gt;left, newWord); printf("Word being added towards rightn"); root-gt;depth =1; } else if(strcmp(newWord, root-gt;word)==0) { printf("Word being duplicated"); root-gt;frequency =1; } return(root); } int inOrder(node* root) { if(root != NULL) { inOrder(root-gt;left); printf("BADAM %st", root-gt;word); printf("%dn", root-gt;frequency); inOrder(root-gt;right); } } void main() { FILE *infile; FILE *outfile; char string[MAXSIZE]; int i, c, n, j, k; node *root; root = NULL; infile = fopen("in.txt", "r"); fscanf(infile, "%dn", amp;n); for(i=0;ilt;n;i ) { printf("%dn", i); fscanf(infile, "%d %sn", amp;c, string); printf("the action is %dn", c); switch (c) { case 1: printf("insert %sn", string); insert(root, string); break; case 2: printf("print frequency of %sn", string); break; default: printf("error in inputn"); break; inOrder(root); } } }
Комментарии:
1. Ну, вы возвращаете новый корень, но никогда не используете возвращенное значение. Простое изменение локальной переменной с именем root ничего не сообщает вызывающему абоненту, потому что это локальная переменная.
Ответ №1:
Вам нужно назначить возвращенный указатель из функции insert корню указателя
root = insert(root, string);
и в рамках функции вам нужно написать
root-gt;left = insert(root-gt;left, newWord);
и вместо использования root-gt;слева в этом фрагменте кода
else if(strcmp(newWord, root-gt;word)gt;0) { insert(root-gt;left, newWord); //...
вам нужно использовать корневой указатель-gt;правый
else if(strcmp(newWord, root-gt;word)gt;0) { root-gt;right = insert(root-gt;right, newWord); //...