2017-04-25 9 views
-2

私は、同じ引数を与えられたノードのために自分のノードを見ている検索機能を作ろうとしていますが、私はこれを行う方法について私の頭を包んでいるようには見えません。私のノード(要素)は、ポインタnext_、T color_、およびstring name_で構成されています。私は見つけたノードと前のノードとのペアを返す必要があります。見つからないか、前にない場合は、nullのポインタを返します。単独リンクされたリストの検索

template<typename T> 
pair<Element<T>*, Element<T>*> PAL<T>::find(string name){ 
    pair<Element<T>*, Element<T>*> *result = nullptr; 
    Element<T>* x = nullptr; 
    Element<T>* y = nullptr; 
    for (Element<T> *n = back_; n != nullptr; n = n -> next_){ 
     if (n -> name_ == name){ 
      Element<T>* x = Element<T>(n -> name_, n -> color_); 
      result.first = x; 
      result.second = y; 
      break; 
     } 
     Element<T>* y = Element<T>(n -> name_, n -> color_); 
    } 
    return result; 
} 

私は自分が何をしているのかわからないので、これは初めてのリストです。私はどんな種類の助けにも感謝し、必要に応じてもっと情報を提供することができます! ありがとうございました!

+0

意味はありますか? :/ – Alex

+0

正直言って、これを試してみる前に、些細なことの*もっと*単純化されたリンクリスト(テンプレートなし)であなたの頭をラップすることから始めます。ここでは、より基本的な(ポインタ管理)の兆候があります。あなたは、その不安に加えてテンプレート管理を必要としません。 – WhozCraig

+0

あなたが 'nullptr'を使用しているということは、あなたがC++ 11以降を使用していることを示唆しています。これは単一のリンクされた[' std :: forward_list'](http://en.cppreference.com/w/cpp/ container/forward_list)クラスを使用します。私はあなたが手動でこの種のものを実装する代わりに、それを使用することを検討することをお勧めします。しかし、あなたは本当に**単一の**リンクされたリストが必要ですか?これは、** '** std :: list'(http://en.cppreference.com/w/cpp/container/list)のように** ** ** **リンクされたリストを使うとずっと簡単になるからです。 –

答えて

0

あなたは一般的にstd::pairとポインタを誤って使用しています。第二の要件は本当に汎用検索機能のために意味がないことを

また、「または全く以前を発見していない場合ははnullを返します」、!本当にリストの最初のノードを無視しますか?

また
template <typename T> 
struct Element 
{ 
    Element* next_; 
    T color_; 
    std::string name_; 
}; 

template <typename T> 
class PAL 
{ 
public: 
    //... 
    std::pair<Element<T>*, Element<T>*> find(std::string name); 

private: 
    Element<T> *head_; // pointer to FIRST element 
}; 

template <typename T> 
std::pair<Element<T>*, Element<T>*> PAL<T>::find(std::string name) 
{ 
    Element<T> *previous = nullptr; 

    for (Element<T> *node = head_; node != nullptr; node = node->next_) 
    { 
     if (node->name_ == name) 
     { 
      if (previous != nullptr) 
       return std::make_pair(node, previous); 

      break; 
     } 

     previous = node; 
    } 

    return std::make_pair<Element<T>*>(nullptr, nullptr); 
} 

もしそうなら、もっとこのような何かしようと

template <typename T> 
std::pair<Element<T>*, Element<T>*> PAL<T>::find(std::string name) 
{ 
    if (head_ != nullptr) 
    { 
     Element<T> *previous = head_; 

     for (Element<T> *node = head_->next; node != nullptr; node = node->next_) 
     { 
      if (node->name_ == name) 
       return std::make_pair(node, previous); 

      previous = node; 
     } 
    } 

    return std::make_pair<Element<T>*>(nullptr, nullptr); 
} 

をしかし、あなたが本当に最初のノードを無視したくない場合は、(代わりにこれを試してみて、前のノードがnullの場合、呼び出し元に何をすべきかを決定させてください)。

template <typename T> 
std::pair<Element<T>*, Element<T>*> PAL<T>::find(std::string name) 
{ 
    Element<T> *previous = nullptr; 

    for (Element<T> *node = head_; node != nullptr; node = node->next_) 
    { 
     if (node->name_ == name) 
      return std::make_pair(node, previous); 

     previous = node; 
    } 

    return std::make_pair<Element<T>*>(nullptr, nullptr); 
} 
+0

ああ、私はちょうど私の人生を複雑にしていた!本当にありがとうございます:D 正直なところ、これは理解しやすい方法です。 – Alex

関連する問題