Как исправить ошибку, когда узел в дереве не печатается - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь вставить 4 имени в BST. У меня есть операторы print, которые говорят, где в дереве проходит имя, и затем оператор print, который выводит «ноль», когда имя находит правильное место. Например:

Если корень - Деннис, а следующий вставляемый узел - Армин, он печатает

левый нуль

Однако, когда я пытаюсь распечатать дерево по порядку, мне не хватает имени.

Я попытался вручную распечатать узлы, как при печати, например printf ("% s", node-> data); но я просто получаю ошибку сегментации.

Имена, которые я пытаюсь напечатать: яблоко, кризис, Денис, Локи. Выходные данные: яблоко, крист, локи. Это всегда пропускает Деннис.

bstNode* insertNode(bstNode *root, char *data){

    if(root == NULL){
        printf("null, %s\n", data);

        root = newNode(data);
        return;
        }

    else if(wordSort(root->data, data) == -1){
        printf("right, %s\n", data);
        root->right = insertNode(root->right, data);
    }
    else if(wordSort(root->data, data) == 1){
        printf("left, %s\n", data);
        root->left = insertNode(root->left, data);
    }
}
  void printTree(bstNode *node){
//printf("%s\n", node->left->data);
//printf("%s\n", node->data);
//printf("%s\n", node->right->data);
//printf("%s\n", node->right->right->data);


 if (node == NULL)
          return;

     printTree(node->left);


     printf("%s\n", node->data);


     printTree(node->right);

}
bstNode* newNode(char *data){

bstNode* newnode = (bstNode*)malloc(sizeof(bstNode));
newnode->data =  (char*)malloc(100 * sizeof(char));
strcpy(newnode->data, data);
newnode->left = NULL;
newnode->right = NULL;
strcpy(newnode->data, data);
newnode->count = 1;
return newnode;
}

Ответы [ 2 ]

1 голос
/ 23 июня 2019

Функция insertNode имеет неопределенное поведение, потому что ничего не возвращает, хотя имеет тип возвращаемого значения bstNode *.

. Ее можно определить и вызвать следующим образом, как показано в демонстрационной программе.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct bstNode
{
    char *data;
    struct bstNode *left;
    struct bstNode *right;
} bstNode;

bstNode * newNode( const char *data )
{
    bstNode *node = malloc( sizeof( bstNode ) );

    if ( node != NULL )
    {
        node->left  = NULL;
        node->right = NULL;

        size_t n = strlen( data );
        node->data = malloc( n + 1 );

        if ( node->data != NULL )
        {
            strcpy( node->data, data );
        }
        else
        {
            free( node );
        }
    }

    return node;
}

bstNode * insertNode( bstNode *root, const char *data )
{
    if ( root == NULL )
    {
        root = newNode( data );
    }
    else if ( strcmp( root->data, data ) < 0 )
    {
        root->left = insertNode( root->left, data );
    }
    else
    {
        root->right = insertNode( root->right, data );
    }

    return root;
}

void printTree( const bstNode *root )
{
    if ( root != NULL )
    {
        printTree( root->left );
        puts( root->data );
        printTree( root->right );
    }
}
int main(void) 
{
    bstNode *root = NULL;

    root = insertNode( root, "pple" );
    root = insertNode( root, "cris" );
    root = insertNode( root, "dennis" );
    root = insertNode( root, "lok" );

    printTree( root );

    return 0;
}

Вывод программы:

pple
lok
dennis
cris
0 голосов
/ 23 июня 2019

Ошибка в вашей логике. Пожалуйста, убедитесь, что вы хорошо понимаете рекурсию. Например, в приведенном ниже операторе вы указываете на root-> right на ничто, так как при выполнении инструкции insertNode (root-> right, data) он входит в первый блок if, а затем, когда корень имеет значение null, создает узел с данными но не возвращает ни одного узла.

root->right = insertNode(root->right, data);

Вот почему ваша программа получает ошибку сегментации. Ваша программа создает узлы, но не связывает их.

...