0

私は現在、C++ でリンク リストがどのように機能するかを学んでおり、このコードを書いたところ、コンパイル エラーが発生し、以前のバージョンのコードで取得した結果が得られません。これは、私が失った以前のコードの初期バージョンです。

だから私は助けが必要です:

add 関数 (要素をリストの最後に置く) はどのように見えるべきですか?

デコンストラクターに何を追加する必要がありますか?

そして、値 t を持つすべての要素を削除する必要がある remove_if( T& t )、すべての要素 pred を削除する必要がある remove_if(predicate& pred) は true を返しますか?

Between T> に何を追加する必要がありますか?

私が編集した私のコード:

    #include <iostream>
    using namespace std;

    template <class T>
    class List;

    template <class T>
    class Node {
    public:
      Node ( T *t) : data(t), next(0) {}
      ~Node();
    private:
      T *data;
      Node* next;
      friend class List<T>;
    };

    template <class T>

    class Predicate {
     public:
      Predicate() {}
      virtual bool operator()( const T& v) = 0;
    };

    template <class T>
    class List {
    public:
      List() : first(new Node<T>(T())) {} //"dummy"-node

      void add( T *t );
      void remove_if( T t );
      void remove_if( Predicate<T> &pred );
      void print(); 

    private:  
      Node<T> *first;
    };

主要:

    int main()
    {

      List<int> intlista;
      intlista.add( new int(1) );
      intlista.add( new int(2) );
      intlista.add( new int(3) );
      intlista.add( new int(2) );
      intlista.add( new int(4) );
      intlista.add( new int(5) );
      intlista.add( new int(6) );

      intlista.print();

      intlista.remove_if( 2 );
      intlista.print();

      Between<int> one_to_four(1,4);
      intlista.remove_if( one_to_four );  
      intlista.print();
    }

書きました:

    { 1 2 3 2 4 5 6 }
    { 1 3 4 5 6 }
    { 5 6 }
4

1 に答える 1

0

これは実際にはあなたの質問には答えませんが、

template <class T>
class Node {
public:
  Node ( T *t) : data(t), next(0) {}
  ~Node();
private:
  T *data;
  Node* next;
  friend class List<T>;
};

リンクされたリストに T へのポインターを格納するのは間違っているようです。テンプレート化されたリンクリストの要点は、保存されたデータをそのままリストに直接保存できることです (そして、何らかの理由でint *リストに保存したい場合は、 List<int *> list;.

さて、あなたの実際の質問:Betweenあなたのクラスの 1 つですか? もしそうなら、あなたはそれのためのヘッダーを含めましたか?

于 2013-05-25T11:56:02.117 に答える