2011-12-26 98 views
0


有什么区别[insert_node(&(tmp-> left),value);] VS [tmp = tmp-> right; insert_node(&(TMP),值);]插入二叉树的方法

void insert_node(struct btree **bt,int value) 
{ 
    btree *tmp= *bt, *r ; 

    if(*bt==NULL)// first node 
    { 
      (*bt)=(struct btree *)malloc(sizeof(btree)); 
      (*bt)->data=value; 
      (*bt)->left=NULL; 
      (*bt)->right=NULL;   
    }  
    else 
    { 
     if(value > tmp->data) 
      insert_node(&(tmp->right),value); 
     else 
      insert_node(&(tmp->left),value);     
    } 

     #if 0 //start 
      OR /** COMMENT START 

     earlier I had below piece of code but not working 
     can any please explain what's the difference in 
     insert_node(&(tmp->left),value); VS [ tmp=tmp->right; insert_node(&(tmp),value);] 
     COMMENT END **/ 

     else 
    { 
     if(value > tmp->data) 
      tmp=tmp->right; 
     else 
      tmp=tmp->left ; 
      insert_node(&tmp,value);     
    } 
    #endif //end 

} 

回答

1

在非工作情况下,您要将tmp变量的地址赋给它,并因此更新该指针,该指针位于堆栈上,不会用于任何事情。

在工作案例中,你正在给你的bt节点上的实际指针的地址,这是你想要的。

+0

什么喜弗朗西斯但调用我通过适当的值初始化我之前TMP TMP = TMP->左,TMP->右键然后我按地址传递。你能解释一下吗? – 2011-12-26 06:31:23

+0

是的,tmp指向tmp-> right指向的任何东西,但是你正在修改tmp中的指针(因为你给出了tmp的地址),并且你想要修改的是指针tmp->正确(在工作示例中给出了该地址)。 – 2011-12-26 06:33:17

0

没有语义差异。 #2将下一个节点存储在局部变量中,该局部变量将是一个寄存器,而#1将该节点存储到寄存器中,但它不会作为局部变量提供。

如果您需要再次访问该值,请使用#2。

+0

不知道你解释可以请详细说明 – 2011-12-26 06:34:37