2

構造体へのポインタを返す際に問題が発生しました。私が間違っていることを説明できる人はいますか?search()一致する入力へのポインタを返したい。それらが「配列」内で重複している場合に備えて、それはベクトルに格納されます。これは機能しているようですが、返されたポインタから「データ」を取得できませんか?

struct Node
{
    int data;
    Node *left;
    Node *next;
};

vector<Node *> array;


void find(int & input)
{
     currentSize = 0;
     vector<Node *> hold;

    for( int i = 0; i < array.size( ); i++ ){
        if(search(array[i], input) != NULL)
        {
            hold.push_back(search(array[i], input));
        }
        else{
            cout << "The Key is not found" << endl;
        }

    }

    for(int i = 0; i < hold.size(); i++)
    {
        cout << hold[i] << endl;
        //Problem here:: I want to see the "data" that the search function returned not the hex value
    }
}


Node * search(Node * x, const int & input)
{
    if( x == NULL )
    {
       return NULL;
    }
    else
    {
        if(input == x->element)
        {
            return x;
        }
            search(x->left, input);
            search(x->next, input);
    }
}
4

3 に答える 3

3

コンパイラの警告をオンにする必要があります。

検索のすべてのコードパスが値を返すわけではありません。特に、コンパイラが脳死していない場合に表示されるはずの警告です。

これを修正するには、これを置き換えます。

            search(x->left, input);
            search(x->next, input);
    }
}

と:

            Node* leftSearch = search(x->left, input);
            if (leftSearch)
              return leftSearch;
            return search(x->next, input);
    }
}

再帰呼び出しはsearch()、戻り値を現在の関数の戻り値に自動的に渡しません。:)

さらに、Zackが指摘しているように、Nodeそれを印刷するには、のサブフィールドを確認する必要があります。最初に、戻り値がnullptr(またはNULLC ++ 11非対応のコンパイラーで)あるかどうかを確認します(nullの場合、安全に逆参照できず、検索が失敗したことを示します)。

nullptr'でない場合は、->data印刷する前にそれを実行してください。

つまり、変更:

    cout << hold[i] << endl;

に:

    if (hold[i]) {
      cout << "Found: " << hold[i]->data << "\n";
    } else {
      cout << "Not Found\n";
    }

std::endl各行のバッファをフラッシュする必要がないため、を使用していないことに注意してください。

于 2012-11-24T02:52:08.153 に答える
1

印刷hold[i]しているのは、ノードへのポインタであり、hold[i]->data印刷したいように見えるノードではありません。

また、このコードはほぼ確実にふるいのようにリークしたり、ヒープを破損したりしますが、何が問題なのかを説明するのに十分なコードが表示されていません。

于 2012-11-24T02:51:48.383 に答える
0
        search(x->left, input);
        search(x->next, input);

これらの2つの呼び出しの結果は無視されます。おそらく最初の検索の結果を保存する必要があります。そうでない場合はNULL、それを返します。そうでない場合は、2番目の検索の結果を返します。

Node* res = search(x->left, input);
if (res) return res;
return search(x->next, input);
于 2012-11-24T02:52:29.023 に答える