C 为什么我能';在不返回根指针的情况下,是否将我的树添加为元素?

C 为什么我能';在不返回根指针的情况下,是否将我的树添加为元素?,c,pointers,tree,binary-tree,binary-search-tree,C,Pointers,Tree,Binary Tree,Binary Search Tree,这是我的代码,我不理解这些指针的工作方式 #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(){

这是我的代码,我不理解这些指针的工作方式

#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);
}
我可以像最后一个一样使用它,但我必须了解造成这种差异的原因。 (差异:&根到节点**根//不必返回根,工作正常! 根到节点*根//必须返回根,否则无法工作) 直到今天,我还以为这两种方式是一样的,但显然不是。所以,请帮帮我,我快疯了。任何帮助都将不胜感激,谢谢你不是这个意思吗

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);
    }
}
void添加元素(节点**根,整数数据){
如果(*root==NULL){
*root=getNewNode();
(*根)->x=数据;
}否则{
如果((*根)->x右,数据);
其他的
添加元素(&(*根)->左,数据);
}
}

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

哦,我一直认为它是这样的,例如exp:
#包括

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

void random(int*Arr,int size){
int i;

例如(i=0;我是这个网站的新手,所以我想我回答了我的问题。:D如果你能对它进行评论,我会非常感激,谢谢你。在这个例子中,你已经在
int-Arr[50];
行上创建了实例。然后你将它作为引用传递(数组对象,而不是变量
Arr
)为了修改它的内容。在你的
add_Element()
函数中,你在函数中创建了节点,它被“卡住”在那里,直到它以某种方式返回。如果你先创建根节点,然后将它传入,你可以修改它的内容(就像你对数组所做的那样)——这也是另一种方法(所以你不必通过引用来通过变量)。非常感谢你,伙计。大约7小时后我就要考试了,这对我大有帮助:D大学一年级:D
void main(){
   node * root = NULL;
   root = add_Element(root,48464);//random number 
}
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);
    }
}
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;