【问题标题】:Inserting in a Binary Search Tree插入二叉搜索树
【发布时间】:2018-06-19 19:25:24
【问题描述】:

我已经做了一个二叉搜索树

struct BTNode
{
    int info;
    struct BTNode *left,*right;
};

我写了一个代码来在树中插入一个节点

void insert(struct BTNode *root,int data)
{
    struct BTNode *ptr;
    struct BTNode *n=malloc(sizeof(struct BTNode));
    n->info=data;
    n->left=NULL;
    n->right=NULL;
    if(root==NULL)
    root=n;
    else{
    ptr=root;
    while(ptr!=NULL){
        if(data<ptr->info){
            if(ptr->left==NULL)
            ptr->left=n;
            else
            ptr=ptr->left;
        }
        else if(data>ptr->info){
            if(ptr->right==NULL)
            ptr->right=n;
            else
            ptr=ptr->right;
        }
    }
    }
}

还有一个 main() 函数

int main()
{
    struct BTNode *root=NULL;
    int choice,data;
    printf("\n1.Insert 2.Preorder 3.Exit\n");
    scanf("%d",&choice);
    switch(choice){
        case 1:
        printf("\nWrite the data: ");
        scanf("%d",data);
        insert(root, data);
        break;

但是当我尝试插入一个节点时,我的程序崩溃了。任何提示有什么问题?

【问题讨论】:

  • root=n; 只会在函数中生效。
  • if(root==NULL) root=n; 您只是将本地变量设置为指向n
  • 我只是好奇,你是用这样的格式编码还是因为堆栈溢出编辑器或其他原因?

标签: c pointers tree malloc binary-search-tree


【解决方案1】:

如果你想改变你的根指针指向的位置,你应该传入一个指向你的根指针的指针(对不起,如果这有点令人费解)。

你想要的是这样的:

void insert(struct BTNode **root,int data)
{
...
    if(*root == NULL) {
        *root = n;
    }
...
}

然后当你调用它时,你会将地址传递给你的根指针:

int main()
{
    struct BTNode *root=NULL;
    int data;
    ...
    scanf("%d", &data);
    insert(&root, data);
    ...
}

上面还要注意:您应该将变量的地址传递给scanf。也许这只是您转移时的一个错字,因为您使用 choice var 正确地做到了这一点。

【讨论】:

    【解决方案2】:

    正如其他人所说,修改作为参数的指针不会在方法之外产生任何影响。

    C 通过值而不是引用传递指针。这意味着您在函数中处理的指针是一个不同的指针,它只是指向同一个东西。您必须将指针传递给像我上面的答案这样的指针。

    我希望我能对这个解释发表评论,但我想我需要声誉才能做到这一点..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多