【问题标题】:Why i can't add my tree an element without returnnig the pointer of root?为什么我不能在不返回根指针的情况下添加我的树元素?
【发布时间】:2015-04-01 20:23:33
【问题描述】:

这是我的代码,我不明白这些指针和 & 在这里工作的方式。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct node {
  int x;
  struct node * left;
  struct node * right;

} node;
void add_Element(node **,int);
node * getNewNode();

void main(){
  node * root = NULL;
  add_Element(&root,4687);
  inorder_tra_recursive(root);
  if(root == NULL) printf("still Nulll\n");
  else printf("not null , working\n");
}

node * getNewNode(){
  node * newNode = (node*)malloc(sizeof(node));
  newNode->left = NULL;
  newNode->right = NULL;
  newNode->x = 0;
  return newNode;
}

void add_Element(node ** root,int data){
  *root = getNewNode();
  (*root)->x = data;
  // I did not  write all function !! this is just a prototype and this is working
}

void inorder_tra_recursive(node * root){// looking for elements to print !
  if(root==NULL) 
     return ;

  inorder_tra_recursive(root->left);
  printf("----%d----\n", root->x);
  inorder_tra_recursive(root->right);
}

这是我的代码,当我将 add_Element 函数更改为此时,我不明白这一点。

void add_Element(node * root,int data){
    if(root==NULL){
        root = getNewNode();
        root->x = data;
    }else{
        if(root->x <= data)
            add_Element(root->right,data);
        else
            add_Element(root->left,data);
    }
}

它不会向树中添加元素。但如果我这样做

node * add_Element(node * root,int data){

if(root==NULL){
    root = getNewNode();
    root->x = data;
    return root;
}else{
    if(root->x <= data)
        root->right = add_Element(root->right,data);
    else
        root->right = add_Element(root->left,data);
}
return root;

}

它有效,但这里有什么区别,为什么我必须返回 root 才能获得结果。

void main(){
   node * root = NULL;
   root = add_Element(root,48464);//random number 
}

我可以像最后一个一样使用它,但我必须了解导致这种差异的原因。 (difference: &root to node ** root // 不必返回 root ,有效! root to node * root // 必须返回 root 否则不起作用) 直到今天,我认为这两种方式是相同的,但显然不是。所以,请帮帮我,我快疯了:D。任何帮助将不胜感激,谢谢

【问题讨论】:

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


    【解决方案1】:

    你不是这个意思吗?

    void add_Element(node ** root,int data){
        if(*root==NULL){
            *root = getNewNode();
            (*root)->x = data;
        }else{
            if((*root)->x <= data)
                add_Element(&(*root)->right,data);
            else
                add_Element(&(*root)->left,data);
        }
    }
    

    在您的第一个示例中,您通过引用传递一个指针变量(将&amp;root 传递给node ** root 参数)。在第二种情况下,您不是(仅传递指针值root,因此指针变量root 本身无法更改),因此新节点对象丢失 - 除非您返回它,就像您最终不得不做的那样.

    【讨论】:

    • 我是这个网站的新手,所以我回答了我的问题。 :D 如果你能评论它,我会非常感激,谢谢
    【解决方案2】:

    哦,好吧,我一直以为是这样的,对于exp:
    #包括

    void main(){
        int Arr[50];
        random(Arr,50);
        printf("%d", Arr[25]);
    

    }

    void random(int * Arr,int size){
       int i;
       for(i=0;i<size;i++)
       Arr[i] = i+1;
    

    } ** 所以在这里我通过引用传递一个指针,但是当它是一个指针时,我必须使用“&”通过引用传递它。 我相信我的 exp 是正确的,如果不是,我仍然缺少某些部分**

    【讨论】:

    • 在这个例子中,你已经在int Arr[50]; 行上创建了实例。然后您将其作为引用(数组对象,而不是变量Arr)传递以修改其内容。在您的add_Element() 函数中,您正在函数内部创建节点,并且它“卡”在那里,直到它以某种方式返回。如果您首先创建根节点,然后将其传入,则可以修改其内容(就像您对数组所做的那样) - 这也是另一种方法(因此您不必通过引用传递变量)。
    • 非常感谢你,伙计。我有一个 7 小时后的考试,这对我很有帮助:D 拼贴的第一年:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    相关资源
    最近更新 更多