簡體   English   中英

創建二分搜索樹而不更新指針

[英]creating a binary search tree not updating the pointer

我正在創建一個簡單的二進制搜索樹。當我使用頭指針調用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的更改值進行相應的更新。

UPDATE

head=add(head,1);

當您傳遞一個指針(這里是node *)時,您只需復制它指向的內存地址的值,就可以在函數中更改該地址的內容,但是指針之外的指針仍將包含相同的地址。

最初,您有head = NULL ,它沒有指向任何地方。 調用該函數時,將創建一個名為root的局部變量,並將指針(NULL)的值復制到該變量中。 然后,您分配一些空間並更改root以指向該位置,但是一旦離開函數,對局部變量的更改將丟失,並且head將繼續保留值NULL 您實際上失去了分配的內存,因為那里再也沒有人分了(Valgrind可能已經告訴過您)。

如果改為將&head傳遞給函數(類型將為node** ,請注意,您必須以這種方式在函數內部使用*root ),更改將直接在外部變量上進行(由於事實c實際上會將main()在堆棧上將其分配的地址直接傳遞給該函數)。
順便說一句,在c ++中,通過引用傳遞值將在內部模擬相同的事物,甚至會更簡單(您將能夠使代碼照原樣引用root )。

另外,您也可以從函數中返回新的頭指針的值。 不過,這會將您限制為單個返回值(在這種情況下可以)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM