C 创建二叉搜索树而不更新指针

C 创建二叉搜索树而不更新指针,c,tree,binary-tree,C,Tree,Binary Tree,我正在创建一个简单的二进制搜索树。当我使用head指针调用add方法时,该方法中所做的更改不会反映到此head指针上。它仍然指向null struct node *add(struct node *root,int data) { if (root==NULL) { root=(struct node *) malloc(sizeof(struct node)); root->data=data; root->left=

我正在创建一个简单的二进制搜索树。当我使用head指针调用add方法时,该方法中所做的更改不会反映到此head指针上。它仍然指向null

struct node *add(struct node *root,int data)
{
    if (root==NULL)
    {
        root=(struct node *) malloc(sizeof(struct node));
        root->data=data;
        root->left=NULL;
        root->right=NULL;
        return root;
    }
    else
    {   
        if (data<=root->data)
        {
            root->left=add(root->left,data);
        }
        else
        {
            root->right=add(root->right,data);
        }
        return root;
    }

}
根据我的理解,在调用add方法时,root=head,因此head将指向root所指向的同一内存位置,并且应该相应地用root的变化值进行更新

更新

head=add(head,1);
当你传递一个指针(这里是节点*)时,你只需复制它所指向的内存地址的值,你可以在函数中更改这个地址的内容,但是它之外的指针仍然包含相同的地址

最初你有
head=NULL
,它没有指向任何地方。调用函数时,创建一个名为
root
的局部变量,并将指针的值(NULL)复制到该变量中。然后分配一些空间并将
root
更改为指向那里,但是一旦离开函数,对局部变量的更改将丢失,并且
head
outside将继续保留值
NULL
。实际上,您丢失了分配的内存,因为不再有人指向那里(valgrind可能会告诉您)

如果您将
&head
传递给函数(类型将是
节点**
,请注意,您必须以这种方式在函数内部使用
*root
),更改将直接在外部变量上进行(由于c实际上会传递main()所在的地址)在堆栈上将其直接分配给函数)。
顺便说一下,在C++中,通过引用传递值将在内部模拟相同的事情,甚至更简单(你可以保持你的代码引用<代码>根< /代码> AS)。
或者,您也可以从函数返回新头指针的值。这会将您限制为一个返回值(在本例中这很好)

提示:您的函数正在小心地返回某些内容。你的呼叫代码完全忽略了这一点。明白了:)我已经更新了。
head=add(head,1);