web-dev-qa-db-fra.com

Comment pourrais-je créer une liste en c ++?

Comment créer une liste en C++? J'en ai besoin pour créer une liste chaînée. Comment pourrais-je m'y prendre? Existe-t-il de bons tutoriels ou exemples que je pourrais suivre?

28
jessemiel

Je suppose que vous savez que C++ a déjà une classe de liste chaînée et que vous souhaitez implémenter la vôtre parce que vous souhaitez apprendre à le faire. 

Tout d’abord, lisez Pourquoi utilisons-nous des tableaux plutôt que d’autres structures de données? , qui contient une bonne réponse des structures de données de base. Ensuite, réfléchissez à la façon de les modéliser en C++:

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

C'est tout ce dont vous avez besoin pour mettre en place une liste! (un très simple). Pourtant, il n’ya pas d’abstractions, vous devez relier les éléments par main:

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

Maintenant, vous avez une liste chaînée de nœuds, tous alloués sur la pile:

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

La prochaine étape consiste à écrire une classe wrapper List qui pointe vers le nœud de départ et permet d’ajouter des nœuds selon les besoins, en gardant une trace de l’en-tête de la liste (la procédure suivante est très simplifiée):

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;
    }

    // ...
};

La prochaine étape consiste à faire de la liste un modèle, de manière à pouvoir renseigner d’autres valeurs (pas uniquement des entiers). 

Si vous connaissez les pointeurs intelligents, vous pouvez alors remplacer les pointeurs bruts utilisés par des pointeurs intelligents. Souvent, je trouve que les gens recommandent des pointeurs intelligents aux débutants. Mais à mon avis, vous devez d’abord comprendre pourquoi vous avez besoin de pointeurs intelligents, puis les utiliser. Mais cela nécessite que vous ayez d'abord besoin de comprendre les pointeurs bruts. Sinon, vous utilisez un outil magique, sans savoir pourquoi vous en avez besoin. 

43

Vous devriez vraiment utiliser le standard List class . À moins, bien sûr, que ce soit une question de devoir ou de savoir comment les listes sont mises en œuvre par STL.

Vous trouverez de nombreux tutoriels simples via google, comme celui-ci . Si vous voulez savoir comment les listes chaînées fonctionnent "sous le capot", essayez de rechercher des exemples/tutoriels de listes C plutôt que C++.

22
Roddy

Si vous allez utiliser std::list, vous devez passer un paramètre de type:

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

Si vous voulez savoir comment fonctionnent les listes, je vous recommande de rechercher certains didacticiels C/C++ sur Google afin de mieux comprendre ce sujet. La prochaine étape consisterait alors à apprendre suffisamment de langage C++ pour créer une classe de liste et enfin une classe de modèle de liste.

Si vous avez plus de questions, demandez ici.

14
karx11erx

Pourquoi réinventer la roue? Utilisez simplement le conteneur de liste STL.

#include <list>

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

Plus d'information...

7
mepcotterell

Je suppose que c’est une question de devoirs, donc vous voudrez probablement y aller ici . Il contient un tutoriel expliquant les listes chaînées, donne un bon pseudocode et dispose également d’une implémentation C++ que vous pouvez télécharger.

Je vous recommande de lire l'explication et de comprendre le pseudocode avant d'utiliser aveuglément l'implémentation. C’est un sujet que vous devez comprendre de manière approfondie si vous souhaitez continuer dans CS.

1
brien
0
plan9assembler

Créer une liste à l'aide de modèles C++

c'est à dire

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. 
}; 

Ensuite, vous pouvez écrire du code comme:

List<MyClass>;

Le type T n’est pas dynamique au moment de l’exécution. C’est uniquement pour le moment de la compilation.

Pour un exemple complet, cliquez ici .

Pour le tutoriel sur les modèles C++ cliquez ici

0
Yasitha Bandara