这段代码中的Bug是什么?

时间:2017-03-30 18:13:56

标签: c binary-search-tree

我在开始时将root初始化为NULL,同样将转到第一个插入函数。因为我已经发送了root的地址,所以它应该被更改,但它不会,再次在第二个插入语句中,root的NULL vakue将进入insert函数。

请告诉我,我错过了。

#include <stdio.h>
#include <stdlib.h>
typedef struct bst{
    struct bst *left;
    int data;
    struct bst *right;
}bst_t;

void insert(struct bst**, int);
void print(struct bst*);


int main() {
    struct bst *root;
    root = NULL;

    insert(&root, 45);
    insert(&root, 75);
    insert(&root, 5);
    insert(&root, 76);
    insert(&root, 25);
    insert(&root, 56);
    insert(&root, 89);
    insert(&root, 99);
    insert(&root, 98);

    print(root);

    printf("Print Any Char...\n");
    getch();
    return 0;
}

void insert(struct bst **root, int num)
{
    struct bst *node = *root;

    if(node == NULL)
    {
        node = (struct bst*)malloc(sizeof(struct bst));
        node->left  = NULL;
        node->data  =   num;
        node->right = NULL;
        return;
    }
    else
    {
        if(num < node->data)
        {
            insert(&(node->left), num);
        }
        else
        {
            insert(&(node->right), num);
        }
    }
    return;
}

void print(struct bst *root)
{
    struct bst *temp = root;

    if(temp != NULL)
    {
        printf("%d --> ", temp->data);
        print(temp->left);
        print(temp->right);
    }
    else
    return;
}

1 个答案:

答案 0 :(得分:1)

您制作根指针的本地副本:

struct bst *node = *root;

然后你可以修改它:

node = (struct bst*)malloc(sizeof(struct bst));

不幸的是,您不会将此更改传播回调用方,因此更改将丢失:(

尝试:

*root=node;

最后。

我强烈怀疑这是@一些程序员在他的评论中暗示的那样:)