C-如何修复未打印树节点的误差



我正在尝试将4个名称插入BST。我有打印语句,说明名称正在通过的位置,然后在名称找到有效位置时输出" null"的打印语句。例如:

如果根是丹尼斯,并且要插入的下一个节点是Armin,则打印

离开null

但是,当我尝试按顺序打印树时,我缺少一个名称。

我尝试手动打印节点,就像在这样做时这样做("%s",node-> data(;但是我只是得到一个细分错误。

我要打印的名字是苹果,克里斯,丹尼斯,洛基。不过,输出是:苹果,克里斯,洛基。它总是跳过丹尼斯。

bstNode* insertNode(bstNode *root, char *data){
    if(root == NULL){
        printf("null, %sn", data);
        root = newNode(data);
        return;
        }
    else if(wordSort(root->data, data) == -1){
        printf("right, %sn", data);
        root->right = insertNode(root->right, data);
    }
    else if(wordSort(root->data, data) == 1){
        printf("left, %sn", data);
        root->left = insertNode(root->left, data);
    }
}
  void printTree(bstNode *node){
//printf("%sn", node->left->data);
//printf("%sn", node->data);
//printf("%sn", node->right->data);
//printf("%sn", node->right->right->data);

 if (node == NULL)
          return;
     printTree(node->left);

     printf("%sn", 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;
}

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

错误在于您的逻辑。请确保您了解递归。例如,在下面的语句中,您指向根 -> nothot not note note note to insertNode(root-> right,data(语句执行它输入第一个if block,然后将root null null null它创建一个带有给定数据的节点但是不返回任何节点。

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

这就是为什么您的程序会得到细分故障的原因。您的程序正在做的是它创建节点,而不是链接节点。

最新更新