2017-07-11 1 views
1

私は簡単な質問があります。 LinkListクラスがあり、クラス内でルートが開始されています。変数がクラスで定義されている間の共有ポインタの再帰

理想的には、ノードを検索するための再帰関数を実装したかったのです。今私は、次のように実装:

bool LinkList::search_recursiveUtil(shared_ptr<node> p, int data){ 

    if(p == nullptr){ 
     return false; 
    } 

    if(p->data == data){ 
     return true; 
    } 

    return search_recursiveUtil(p->next, data); 

} 

bool LinkList::search_recursive(int data){ 

    shared_ptr<node> p = root; 
    return search_recursiveUtil(p, data); 
} 

は今、はっきりと私は他の機能は何かをするために、このヘッドポインタを使用する場合がありますように、rootがリンクリストの末尾に到達したくないので、私はあることがわかります共有ポインタPを取得してそれをトラバースする。今私は "search_recursive"関数に渡すpを持っているが、shared_ptr引数を取らないので、 "search_recursiveUtil"関数のサポートを取らなければならなかった。

私の質問は正しいアプローチですか?どのように私はこれをutil関数のサポートを持たないで実装できますか?

+1

と呼ば行うことができるように

代替は、場所ノード・メンバーとして「使用率」機能することができますか?再帰的なソリューションにはほとんど利点がありません。それは信じられないほど空間的に非効率的です。 – StoryTeller

+2

それには何も問題はありませんが、私はそれをより効率的な反復的な方法で実装します。 – MikeMB

+2

また、値によって共有ポインタを渡すことは、const redによって支払うのに比べてかなりのオーバヘッドがあることに注意してください(もちろん、セマンティクスは異なりますが、両方とも動作します) – MikeMB

答えて

0

繰り返し検索の代わりに再帰検索を使用する理由(リストが大きくなるとすぐにスタックのオーバーフローが発生する)に加えて、ポインタは値渡しであるため、pは不要です:return search_recursiveUtil(root, data)に電話してください。あなたの推論は、リストの終わりに近づく根拠には誤解があります。

外部からの検索を呼び出すときに必要でない位置パラメータを使用するxUtil関数を使用することは良い考えです。クラスからプライベートにするだけで、外部からはsearch_recursive関数になります。

また、データが変更されないため、機能constを両方とも宣言してください。あなたは

bool LinkList::node::search_recursiveUtil(int src_data){ 

    if(data == src_data) 
     return true; 

    if(pnext == nullptr) 
     return false; 

    return pnext->search_recursiveUtil(src_data); 

} 

はなぜ再帰的

bool LinkList::search_recursive(int data){ 

    root->search_recursiveUtil(data); 
} 
+0

詳細な回答ありがとうございます。特に誤解について。 –

+0

これらの行について詳しくご説明いただけますか? "外からの検索を呼び出すときに必要とされない位置パラメータを取るxUtil関数の使用は良い考えです。クラスにプライベートにするだけで、外部から - あなたのインターフェースはsearch_recursive関数になります。 また、関数constもデータを変更する予定がないので、両方とも宣言してください。 代わりに "Util"関数をノードメンバとして配置することができます " –

+0

"これで私はそれを得ました。私がconst関数を作成すると、呼び出されたオブジェクトは変更されませんコードは正常に動作しています:) Emilioありがとうございます。 –

0

基本的には、これはちょうど良い方法です。
必要なパラメータを持つ内部関数を呼び出すために必要なパラメータを使用して、インタフェース関数を作成しました。この方法で、rootメンバ変数を隠したままにします。あなたは、あなたのutilメンバー関数をprivateに宣言することもできます。

関連する問題