创建二进制搜索树而不更新指针

时间:2013-11-16 06:50:38

标签: c tree binary-tree

我正在创建一个简单的二叉搜索树。当我使用头指针调用add方法时,方法中所做的更改不会反映到此头指针。它仍然指向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;
    }

}

我将该函数称为

struct node *head=NULL;
add(head,1);
add(head,3);
add(head,15);

根据我的理解,在调用add方法时,root = head,因此head将指向root所指向的相同内存位置,并应相应地更改root的值。

更新

head=add(head,1);

1 个答案:

答案 0 :(得分:1)

当您传递一个指针(此处为node *)时,您只需复制它指向的内存地址的值,您可以在函数中更改此地址的内容,但其外部的指针仍将包含相同的内容地址。

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

如果您将&head传递给函数(类型将为node**,请注意您必须以此方式在函数内使用*root),更改将直接在外部变量上进行(由于事实c实际上会传递main()在堆栈上直接分配给函数的地址)。
顺便说一下,在c ++中,通过引用传递值将在内部模拟相同的事情,甚至更简单(您将能够保持代码按原样引用root)。

或者,您只需从函数返回新头指针的值即可。这会将你限制为单个返回值(在这种情况下这很好)