为什么我不能在不返回根指针的情况下向我的树添加一个元素?

Why i can't add my tree an element without returnnig the pointer of root?

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

#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;

}

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

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

我可以像上一个一样使用它,但我必须了解导致这种差异的原因。 (区别:&root 到节点 ** root // 不必 return root,有效! root to node * root // 必须 return root 否则不工作) 直到今天,我还认为这两种方式是相同的,但显然不是。所以,请帮助我,我在这里要疯了 :D 。任何帮助将不胜感激,谢谢

你不是这个意思吗?

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);
    }
}

在您的第一个示例中,您通过引用传递指针变量(将 &root 传递给 node ** root 参数)。第二种,你不是(只传递指针值root,所以指针变量root本身不能改变),所以新的节点对象丢失了——除非你return它,就像你最终不得不做的那样。

哦,好吧,我一直认为它是这样的,exp:
#include

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 是正确的,如果不是的话,我仍然遗漏了一些部分**