web-dev-qa-db-ja.com

C ++でリストを作成するにはどうすればよいですか?

C++でリストを作成するにはどうすればよいですか?リンクリストを作成するために必要です。それをどうやってやるの?フォローできる良いチュートリアルや例はありますか?

29
jessemiel

C++には既にリンクリストクラスがあり、その方法を学習するために独自のクラスを実装することを知っていると思います。

まず、 なぜ他のデータ構造の代わりに配列を使用するのですか? を読んでください。これには基本的なデータ構造の適切な答えが含まれています。次に、それらをC++でモデル化する方法について考えます。

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

基本的にリストを実装するのに必要なことはこれだけです! (veryシンプルなもの)。まだ抽象化されていないため、手ごとにアイテムをリンクする必要があります。

Node a={1}, b={20, &a}, c={35, &b} d={42, &c};

これで、リンクされたノードのリストがあり、すべてスタックに割り当てられています。

d -> c -> b -> a
42   35   20   1

次のステップは、開始ノードを指すラッパークラスListを記述し、必要に応じてノードを追加し、リストの先頭を追跡できるようにします(以下は非常に単純化されています)。

class List {
    struct Node {
        int data;
        Node * next;
    };

    Node * head;

public:
    List() {
        head = NULL;
    }

    ~List() {
        while(head != NULL) {
            Node * n = head->next;
            delete head;
            head = n;
        }
    }

    void add(int value) {
        Node * n = new Node;
        n->data = value;
        n->next = head;
        head = n;
    }

    // ...
};

次のステップでは、リストをテンプレートにして、整数だけでなく他の値を詰めることができます。

スマートポインターに慣れている場合は、使用されている生のポインターをスマートポインターに置き換えることができます。多くの場合、人々はスターターへのスマートポインターを推奨しています。しかし、私の意見では、最初にスマートポインターが必要な理由を理解してから使用する必要があります。しかし、そのためには、まず生のポインタを理解する必要があります。それ以外の場合は、必要な理由がわからないまま、魔法のツールを使用します。

本当に 標準のListクラス を使用する必要があります。もちろん、これが宿題の質問である場合、またはリストがSTLによってどのように実装されているかを知りたい場合を除きます。

this one のように、グーグル経由でたくさんの簡単なチュートリアルを見つけることができます。リンクリストが「内部」でどのように機能するかを知りたい場合は、C++ではなくCリストの例/チュートリアルを検索してみてください。

22
Roddy

std::listを使用する場合は、型パラメーターを渡す必要があります。

list<int> intList;  
list<int>* intListPtr = new list<int>;

リストがどのように機能するかを知りたい場合は、C/C++のチュートリアルをグーグルで検索して、その主題を理解することをお勧めします。次のステップは、リストクラスを作成するのに十分なC++を学習し、最後にリストテンプレートクラスを学習することです。

他にご質問がある場合は、こちらからお問い合わせください。

15
karx11erx

車輪を再発明する理由。 STLリストコンテナを使用するだけです。

#include <list>

// in some function, you now do...
std::list<int> mylist; // integer list

詳細...

8
mepcotterell

これは宿題の質問だと思うので、おそらく here に行きたいと思うでしょう。リンクリストを説明するチュートリアルがあり、優れた擬似コードを提供し、ダウンロード可能なC++実装もあります。

実装を盲目的に使用する前に、説明を読み、擬似コードを理解することをお勧めします。これは、CSを継続する場合に本当に深く理解する必要があるトピックです。

1
brien
0
plan9assembler

C++テンプレートを使用してリストを作成

すなわち

template <class T> struct Node 
{
    T data;
    Node * next;
};

template <class T> class List 
{
    Node<T> *head,*tail;

    public: 
        void Push(T const&);  // Push element 
        void pop();           // pop element 
        bool empty()          // return true if empty. 
}; 

次に、次のようなコードを記述できます。

List<MyClass>;

タイプTは実行時に動的ではなく、コンパイル時のみに使用されます。

完全な例については、 クリックして聞く

C++テンプレートチュートリアルの場合 クリックして聞く

0
Yasitha Bandara