2017-01-16 6 views
0

私はバイナリ検索ツリーの挿入関数を作成しようとしていました。しかし、最初はnullであるグローバル変数を置き換えることができませんが、2ホップ離れた(すなわちパラメータを介して)NULL以外のグローバル変数を置き換えることができます。次のコードは、問題の内容を示しています。2ホップ離れたグローバル変数を置換できません

struct tree{ 
    int a; 
    tree* right; 
    tree* left; 
}; 
tree* root=NULL; 
void insert(tree* in, int b){ 
     if(in){ 
      if(in->a<b) 
        insert(in->right,b); 
      else if(in->a>b) 
        insert(in->left,b); 
      else 
       cout<<"the value is already in the tree."<<endl; 
     }else{ 
      tree* temp = new tree; 
      temp->a=b; 
      temp->right=NULL; 
      temp->left=NULL; 
      in=temp;// this does not change the root(global variable) value 
     } 
} 
+0

なぜin = tempがグローバル変数を何らかの形で変更するとは思いますか?ローカル変数(関数パラメータ)に代入しています。 –

+0

生ポインタを 'unique_ptr <>'に置き換えると、人生はもう少し簡単になります... – Nim

答えて

1

ポインタを関数から変更する場合は、その関数にダブルポインタを渡す必要があります。

struct tree{ 
    int a; 
    tree* right; 
    tree* left; 
}; 
tree* root=NULL; 
void insert(tree** pIn, int b){ 
     tree* in = *pIn; 

     if(in){ 
      if(in->a<b) 
        insert(&(in->right),b); 
      else if(in->a>b) 
        insert(&(in->left),b); 
      else 
       cout<<"the value is already in the tree."<<endl; 
     }else{ 
      tree* temp = new tree; 
      temp->a=b; 
      temp->right=NULL; 
      temp->left=NULL; 
      *pIn=temp; 
     } 
} 

意味的には間違いませんが、これは今までにない最高のデザインです。

@NathanOliverが示唆するように、2番目のポインタの代わりに参照を使用できます。

+2

または 'tree *&pIn'のように参照渡しすることができます – NathanOliver

+0

私は参考文献を好む。私はそれを呼び出すたびにポイントをキャストする必要はないので。あなたがBSTにノードを追加するために他にどのようなベストデザインを提案していますか? –

関連する問題