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

时间:2015-04-01 20:23:33

标签: 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(){
  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 
}

我可以像最后一个一样使用它,但我必须了解造成这种差异的原因。 (差异:&amp; root to node ** root //不必返回root,有效!   root to node * root //必须返回root,否则无法正常工作) 直到今天,我认为这两种方式是相同的,但显然它不是。所以,请帮助我,我在这里疯狂:D。 Anyhelp将不胜感激,谢谢

2 个答案:

答案 0 :(得分:0)

不,这意味着什么?

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本身不能更改),所以新的节点对象丢失 - 除非你返回它,就像你结束必须这样做。

答案 1 :(得分:0)

哦,好吧,我一直认为这是这样的,对于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;

} **所以这里我通过引用传递一个指针但是当它指向我通过的指针时,我必须使用&#34;&amp;&#34;通过引用传递它。 我相信我的exp是正确的,如果它还没有,那么我仍然缺少一部分**