C 如何修复树中的节点未打印的错误

C 如何修复树中的节点未打印的错误,c,recursion,memory-management,binary-search-tree,undefined-behavior,C,Recursion,Memory Management,Binary Search Tree,Undefined Behavior,我试图在bst中插入4个名称。我有一个print语句,说明名称在树上通过的位置,然后是一个print语句,当名称找到有效位置时,该语句输出“null”。例如: 如果根节点是Dennis,下一个插入的节点是Armin,则会打印 左 空的 然而,当我试图按顺序打印树时,我丢失了一个名称 我尝试手动打印出节点,就像printf一样(“%s”,node->data);但我只是有一个分割错误 我想打印的名字是苹果,克里斯,丹尼斯,洛基。输出结果是:苹果,克里斯,洛基。它总是跳过丹尼斯 bstNode* i

我试图在bst中插入4个名称。我有一个print语句,说明名称在树上通过的位置,然后是一个print语句,当名称找到有效位置时,该语句输出“null”。例如:

如果根节点是Dennis,下一个插入的节点是Armin,则会打印

左 空的

然而,当我试图按顺序打印树时,我丢失了一个名称

我尝试手动打印出节点,就像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);
    }
}

错误在于你的逻辑。请确保您很好地理解递归。 例如,在下面的语句中,当insertNode(root->right,data)语句执行时,您将root->right指向nothing,它将进入第一个if块,然后当root为null时,它将使用给定的数据创建一个节点,但不返回任何节点

root->right=插入节点(root->right,数据)


这就是为什么你的程序会出现分段错误。您的程序所做的是创建节点,而不是链接节点

函数
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;
}

函数bstNode*insertNode(bstNode*root,char*data){虽然返回类型bstNode*
bstNode
严重损坏,但不返回任何内容。例如,如果
root
NULL
,它将调用
newNode
,将结果分配给局部变量
root
,然后返回,丢弃新节点并保持调用方的根不变。它已声明为return一个
bstNode*
但已作为一个(错误)实现
void
函数。需要对其进行修复才能始终返回新的根节点。我当前正在PuTTY上运行程序,这就是代码出现故障的地方,但当我将相同的代码插入在线编译器时,它可以完美地工作。我为什么要在PuTTY上修复它?唯一可行的方法是,如果调用方碰巧遇到p从寄存器中拾取一个杂散值(例如
root
)事实上,这是正确的返回值。但你不能依赖于此。这也是一个毫无意义的错误-只需修复它。你的编译器应该对此代码给出多个警告。在寻求帮助之前始终修复这些警告。我明白你的意思了,Tom。我修复了它,它现在可以工作了,非常感谢:)
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;
}
#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