2013-04-10 2 views
1

Мне нужно вставить строки в двоичное дерево поиска, но каждый из них запускает мою функцию вставки, обновляет все узлы, а не только соответствующую. Необходимо, чтобы каждое слово, помещенное в двоичное дерево поиска, имело точный объем выделенной памяти (+1 для указателя NULL).Вставка строки в двоичное дерево поиска C

Вот структура используется:

typedef struct node_t{ 
    char *word; 
    struct node_t *left, *right; 
} node_t; 

Вот как я передаю в слове:

for(i=0; i< original_words -1; i++) 
{ 
    fscanf(ifp, "%s", y); 
    head = insert(head, y); 
} 

И вот моя вставка функция:

node_t *insert(struct node_t *head, char *word) 
{ 

if(strcmp(head->word, word) > 0) 
{ 

    if(head->left == NULL) 
    { 
     head->left = create_node(word); 
    } 
    else 
    { 
     head->left = insert(head->left, word); 
    } 
} 

else 
{ 
    if(head->right == NULL) 
    { 
     head->right = create_node(word); 
    } 
    else 
    { 
     head->right = insert(head->right, word); 
    } 
} 

return head; 

} 

EDIT: Херес пример входного файла.

4 
------- 
bravo 
------- 
alpha 
------- 
gamma 
------- 
delta 
+0

Что происходит, когда 'strcmp (head-> word, word) == 0'? Вы должны справиться с этим делом конкретно ... –

+3

Сегодня что-то происходит с вставкой в ​​BST. Клянусь Богом, я видел сегодня 5 подобных вопросов. Это день BST в каком-то колледже? – 2013-04-10 20:04:51

+0

@VladLazarenko Вы также можете быть верны на этом. – 2013-04-10 20:12:00

ответ

1

Ваш ответ (insert функции) предполагает, что head уже определена по первому зову, она должна начинаться со строкой:

if (head == null) return create_node(word); 

Это также избавит вас от необходимости нуля строки в коде. Я не уверен, что это вопрос, но он один.

Возможно, что более важно: как работает create_nodeword? Если это что-то вроде:

new_node->word = word 

Тогда все, что вы делаете, это создание коллекции указателей на слово вытаскивают из файла. Вполне возможно, что каждое чтение слова из файла считывает слово в один и тот же фрагмент памяти, поэтому все, что вы делаете, это сбор дерева указателей в одно и то же место в памяти. Это должно быть примерно так:

new_node->word = malloc(strlen(word)+1); 
if (new_note->word == null) {FAIL MEMORY LOSS} 
strcpy(new_node->word, word); 
Смежные вопросы