2016-10-06 4 views
1

最小値と最大値を使用してリンクリストを作成しようとしています。これは本当に愚かなやり方かもしれませんし、私がやりたいことを達成するためにベクトルを使うべきかもしれません。C++でxとyの最小値と最大値の範囲を持つ単一リンクリストを作成する

私は本当に苦労しているのですが、なぜこれがうまくいかないのか分かりません。私はインターネットを注ぎ込み、私の本を見ましたが、何もこれを働かせていません。たぶん私はスマートポインタを使用していますので、それはだと私はここでそれらを使用していますが100%自信を持っていないよ、私のノードは次のとおりです。

struct Node 
{ 
    Node(int m = 0, int M = 0, std::shared_ptr<Node> r = nullptr) : min(m), max(M), right(r){} 
    std::shared_ptr<Node> right; 

    int min; 
    int max; 
}; 

私はこれが正しく設定されていると考えているが、ここでは私の挿入機能があり、私は確かにこれは問題です。そして、それは私がここに失われた時に一種のよのstd :: shared_ptrの

std::shared_ptr<Node> Container::insert(std::shared_ptr<Node> list, int min, int max) 
{ 

    if(!list) 
    { 
     list = std::make_shared<Node>(min, max); 
    } 

    list->right = insert(list->right, min, max); 
    return list; 

} 

するかどうこれはあるいは、void関数であるべきかどうかはわからない、と多分私はちょうど問題を理解していませんよ十分に十分です。基本的には、最小値と最大値を比較できるようにしたいだけです。再び、私は問題に近づいているのは本当に悪い方法かもしれません。

+3

あるべきと仮定すると、永遠に繰り返す? – Galik

+0

STL実装を使用する場合は、 'std :: list >'のようになります。独自の実装を書くことは便利な演習ですが、STLコンテナを使って同じことを試してみてください。 – Rerito

+0

@Rerito、STLコンテナについて聞いたことはありませんが、それらを見なければなりませんどのように動作するかを確認してください。 – Sailanarmo

答えて

2

再帰の基本ケースを追加してコードを修正しました。

std::shared_ptr<Node> Container::insert(std::shared_ptr<Node>& list, int min, int max) 
{ 

    if(!list) 
    { 
     list = std::make_shared<Node>(min, max); 
    }else{ 
     list->right = insert(list->right, min, max); 
    } 

    return list; 

} 

希望します。

+0

を参照して始めてください。私は先に進んで変更を行いました。何らかの理由で、それはelseステートメントに達していません。私はstd :: coutステートメントをelseステートメントの中に置いていますが、それは私が印刷するように言ったものを印刷していません。 ifステートメントの中にstd :: coutステートメントを置くと、何かが出力されます。 – Sailanarmo

+0

@Sailanarmo、結果はあなたが摂食しているものによって異なります。あなたがコードのすべての部分を表示しない限り、私は何も言わない。 – v78

+0

ここに私の現在のコードを持っている私のgithubへのリンクがあります。 https://github.com/Sailanarmo/Group-Algorithm – Sailanarmo

2

あなたは無条件に再帰しているので、決して終了しません。

うではないこと、あなたがlistの末尾に新しいノードを挿入することをあなたは `(挿入呼び出した場合、それはおそらく` `挿入()`関数内)

std::shared_ptr<Node> Container::insert(std::shared_ptr<Node> list, int min, int max) 
{ 
    if(!list) 
    { 
     list = std::make_shared<Node>(min, max); 
    } 
    else 
    { 
     list->right = insert(list->right, min, max); 
    } 
    return list; 
} 
+0

Yeeshは、else文が本当に必要であることを知っていました。私は今のように馬鹿だと感じる。今私はちょうど私がそうすることの私の方法を推測しているこれを試して印刷する必要がありますも間違っています。 – Sailanarmo

+1

@Sailanarmo同じ一般式を使用して印刷することができます。リストに対する構造的再帰は通常複雑ではない。たいていの場合、 'if(!list){...} else {...}'と書くことができます。そして、2つの場合を記入してください。 – molbdnilo

+0

私がやったのは、 'if(!min)std :: cout <<"リストは空です "<< std :: endl;' else 'std :: cout << list->右<<" "; printMin(list-> right) 'それはリストが空であることを私に伝えます。 – Sailanarmo

関連する問題