1

私はこのトピックに関する有用なコンテンツを見つけるためにたくさん検索しましたが、無駄でした。正常に機能しているリンクリストを作成しました。さて、割り当てとして、ファイル「input.txt」で与えられたいくつかの辞書の単語を保存する必要があります。この割り当ては、2Dリンクリストを使用して行う必要がある、つまり、リンクリストのノード内に別のリンクリストを作成する必要があると述べられています。つまり、リンクリストのすべてのノードにリストも含まれるようになります。これはベクトルでも実行できますが、リンクリストの方が役立つと思います。ここで、コードについて考えてみましょう。

//list.h内

template <class T>
struct ListItem
{
    T value;
    ListItem<T> *next;
    ListItem<T> *prev;
    ListItem(T theVal)
    {
        this->value = theVal;
        this->next = NULL;
        this->prev = NULL;
    }
};

template <class T>
class List
{
    ListItem<T> *head;

public:

    // Constructor
    List();

    // Destructor
    ~List();
}

ノード内にリンクリストを作成する必要があるので、「StructListItem」では次のようなことをしています。

List<T> dictionary;

しかし、それはエラーを与えています:

"ISO C++ forbids declaration of âListâ with no type"

次に、ノード内に別のリンクリストを作成するにはどうすればよいですか。つまり、一時ポインタが最初のリンクリストの先頭を指していると仮定します。このノード内に別のノード(2番目のリンクリストに属する)を作成するにはどうすればよいですか。私はこのようなものによるかもしれないと思います:

temp->ListItem<T>* secondListNode = new ListItem<T>(item); // I don't know whether
//It would or not as I am stuck in the first part.

これは2D形式を使用して実行する必要があるため、制約に固執してください。この問題に関する他の有用な提案が役立つでしょう。前もって感謝します。

4

3 に答える 3

1

循環依存があります。へのポインタしかない場合は、最初に宣言してから定義ListItem<T>し、その後でクラスを定義します。List<T>ListItem<T>List<T>ListItem<T>

template<class T>
class ListItem;

template<class T>
class List
{
    ListItem<T> *head;

    // ...
};

template<class T>
class ListItem
{
    // `dictionary` is not a pointer or a reference,
    // so need the full definition of the `List<T>` class
    List<T> dictionary;

    // ...
};
于 2013-02-15T12:12:04.373 に答える
0

辞書を参照するときは、代わりにstd::mapを使用することを検討してください。

例えば:

std::map<std::string, std::list<std::string> >

値をstd::stringとして保存している場合。

于 2013-02-15T12:13:15.447 に答える
0

「リンクリストのすべてのノードにリストも含まれるようになる」という意味を完全に理解しているかどうかはわかりません

文字列のリストのリストが必要な場合は、テンプレート機能のおかげで、既存のリストデータ構造を使用してこれを簡単にインスタンス化できます。

List<List<std::string> > listOfLists;

もちろん、「1Dリスト」を作成することもできます。

List<std::string> otherList;

通常、データ構造をローカル要件に適合させることはお勧めできませんが、代わりに、上記の「リストのリスト」など、より特殊な方法で一般的なデータ構造を使用するようにしてください。「リストのリスト」を別のクラスとして実装したり、ジェネリックリストを2Dリストに変更したりしないでください。これは単なる「任意のタイプのリストT」であるためT、リストにすることもできます(何度も何度も...)。

于 2013-02-15T12:24:58.283 に答える