插入节点后,为什么需要在BST中返回头指针? #包括 #包括 类型定义结构BTreeNode BTNode; 结构B节点 { int值; 结构BTreeNode*左子节点,*右子节点; }; BTNode*插入(int输入值,BTNode**头节点) { BTNode*温度,*头部; temp=malloc(sizeof(BTNode)); 温度->值=输入值; temp->left_child=NULL; temp->right\u child=NULL; head=*head_节点; 而(1) { if(head==NULL) { 压头=温度; //中断; 回流头; } 如果(温度->值>压头->值) { if(head->right\u child==NULL) { 头部->右侧子项=温度; } 其他的 头部=头部->右侧子项; } 否则如果(温度->值值) { if(head->left_child==NULL) { 头部->左侧子项=温度; } 其他的 头部=头部->左侧子项; } 其他的 { 打破 } } 返回*头节点; } int insert\u wor(int input\u值,BTNode**head\u节点) { BTNode*温度,*头部; temp=malloc(sizeof(BTNode)); 温度->值=输入值; temp->left_child=NULL; temp->right\u child=NULL; head=*head_节点; 而(1) { if(head==NULL) { 压头=温度; //中断; 返回1; } 如果(温度->值>压头->值) { if(head->right\u child==NULL) { 头部->右侧子项=温度; } 其他的 头部=头部->右侧子项; } 否则如果(温度->值值) { if(head->left_child==NULL) { 头部->左侧子项=温度; } 其他的 头部=头部->左侧子项; } 其他的 { 返回-1; } } 返回1; } 无效打印树(BTNode**head\u节点) { BTNode*头; head=*head_节点; if(head==NULL) { //printf(“打印退出”); 返回; } 其他的 { printf(“%d\n”,头->值); 打印树(&(head->left_child)); printtree(&(head->right_child)); } } int main() { BTNode*root=NULL,*root\u-wor=NULL; 根=插入(23,&根); 根=插入(32,&根); 根=插入(230,&根); 根=插入(3,&根); 根=插入(2,&根); 根=插入(50,&根); printree(根目录(&R); 插入工作(24,&根工作); 插入工作(42,&根工作); 插入_-wor(45,&根_-wor); 插入工作(12,&根工作); 插入工作(87,&根工作); 插入工作(123和根工作); 打印树(和根目录); }

插入节点后,为什么需要在BST中返回头指针? #包括 #包括 类型定义结构BTreeNode BTNode; 结构B节点 { int值; 结构BTreeNode*左子节点,*右子节点; }; BTNode*插入(int输入值,BTNode**头节点) { BTNode*温度,*头部; temp=malloc(sizeof(BTNode)); 温度->值=输入值; temp->left_child=NULL; temp->right\u child=NULL; head=*head_节点; 而(1) { if(head==NULL) { 压头=温度; //中断; 回流头; } 如果(温度->值>压头->值) { if(head->right\u child==NULL) { 头部->右侧子项=温度; } 其他的 头部=头部->右侧子项; } 否则如果(温度->值值) { if(head->left_child==NULL) { 头部->左侧子项=温度; } 其他的 头部=头部->左侧子项; } 其他的 { 打破 } } 返回*头节点; } int insert\u wor(int input\u值,BTNode**head\u节点) { BTNode*温度,*头部; temp=malloc(sizeof(BTNode)); 温度->值=输入值; temp->left_child=NULL; temp->right\u child=NULL; head=*head_节点; 而(1) { if(head==NULL) { 压头=温度; //中断; 返回1; } 如果(温度->值>压头->值) { if(head->right\u child==NULL) { 头部->右侧子项=温度; } 其他的 头部=头部->右侧子项; } 否则如果(温度->值值) { if(head->left_child==NULL) { 头部->左侧子项=温度; } 其他的 头部=头部->左侧子项; } 其他的 { 返回-1; } } 返回1; } 无效打印树(BTNode**head\u节点) { BTNode*头; head=*head_节点; if(head==NULL) { //printf(“打印退出”); 返回; } 其他的 { printf(“%d\n”,头->值); 打印树(&(head->left_child)); printtree(&(head->right_child)); } } int main() { BTNode*root=NULL,*root\u-wor=NULL; 根=插入(23,&根); 根=插入(32,&根); 根=插入(230,&根); 根=插入(3,&根); 根=插入(2,&根); 根=插入(50,&根); printree(根目录(&R); 插入工作(24,&根工作); 插入工作(42,&根工作); 插入_-wor(45,&根_-wor); 插入工作(12,&根工作); 插入工作(87,&根工作); 插入工作(123和根工作); 打印树(和根目录); },c,pointers,binary-search-tree,C,Pointers,Binary Search Tree,在上面的代码中,我编写了两个不同的函数来在BST中插入节点。 1) 在一个函数中,我在插入节点后返回head指针。 2) 在第二个函数中,我不返回head指针。 当我试图打印的BST第一个工作正常,但我无法打印 第二英国夏令时。 我的疑问是,根据指针的概念,即使我们在成员函数中进行更改,它应该反映在主函数中,但在这种情况下(在第二种方法中,当我传递head并在成员函数中对其进行更改时,它们没有反映在主函数中),这不会发生?? 我想我在某一点上感到困惑。有谁能帮忙澄清一下吗 感谢在第二个版本中,h

在上面的代码中,我编写了两个不同的函数来在BST中插入节点。 1) 在一个函数中,我在插入节点后返回head指针。 2) 在第二个函数中,我不返回head指针。 当我试图打印的BST第一个工作正常,但我无法打印 第二英国夏令时。 我的疑问是,根据指针的概念,即使我们在成员函数中进行更改,它应该反映在主函数中,但在这种情况下(在第二种方法中,当我传递head并在成员函数中对其进行更改时,它们没有反映在主函数中),这不会发生?? 我想我在某一点上感到困惑。有谁能帮忙澄清一下吗


感谢

在第二个版本中,
head=*head\u节点复制头指针。以后更改
头部
时,原始指针(由
头部节点指向
)将永远不会更新。如果您总是使用
*head\u node
而不是它的副本,或者如果您分配了
*head\u node=head返回之前,插入wor()
函数也会工作。

但是当我们将*head\u节点分配给head并更新head时,那么*head\u节点也应该更新知道吗?我认为将*head\u节点分配给head会复制root的地址,因为我正在将&root传递给**head_node@user1317234然后呢?你也需要朝相反的方向复制。
#include<stdio.h>
#include<stdlib.h>

typedef struct BTreeNode BTNode;
struct BTreeNode
{
int value;
struct BTreeNode *left_child,*right_child;
};

BTNode* insert(int input_value, BTNode **head_node)
{
    BTNode *temp,*head;
    temp = malloc(sizeof(BTNode));
    temp->value = input_value;
    temp->left_child = NULL;
    temp->right_child = NULL;
    head = *head_node;
    while(1)
    {
        if(head == NULL)
        {
            head = temp;
//          break;
            return head;
        }
        if(temp->value > head->value)
        {
            if(head->right_child == NULL)
            {
                head->right_child=temp;
            }
            else
                head = head->right_child;
        }
        else if(temp->value < head->value)
        {
            if(head->left_child == NULL)
            {
                head->left_child=temp;
            }
            else
                head = head->left_child;
        }
        else
        {
            break;
        }
    }
    return *head_node;
}

int insert_wor(int input_value, BTNode **head_node)
{
    BTNode *temp,*head;
    temp = malloc(sizeof(BTNode));
    temp->value = input_value;
    temp->left_child = NULL;
    temp->right_child = NULL;
    head = *head_node;
    while(1)
    {
        if(head == NULL)
        {
            head = temp;
//          break;
            return 1;
        }
        if(temp->value > head->value)
        {
            if(head->right_child == NULL)
            {
                head->right_child=temp;
            }
            else
                head = head->right_child;
        }
        else if(temp->value < head->value)
        {
            if(head->left_child == NULL)
            {
                head->left_child=temp;
            }
            else
                head = head->left_child;
        }
        else
        {
            return -1;
        }
    }
    return 1;
}

void printtree(BTNode **head_node)
{
    BTNode *head;
    head = *head_node;
    if(head == NULL)
    {
//      printf("Print exit\n");
        return;
    }
    else
    {
        printf("%d\n",head->value);
        printtree(&(head->left_child));
        printtree(&(head->right_child));
    }
}

int main()
{
    BTNode *root=NULL,*root_wor=NULL;
    root=insert(23,&root);
    root=insert(32,&root);
    root=insert(230,&root);
    root=insert(3,&root);
    root=insert(2,&root);
    root=insert(50,&root);
    printtree(&root);
    insert_wor(24,&root_wor);
    insert_wor(42,&root_wor);
    insert_wor(45,&root_wor);
    insert_wor(12,&root_wor);
    insert_wor(87,&root_wor);
    insert_wor(123,&root_wor);
    printtree(&root_wor);
}