IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Pointeurs et listes chaînées


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut Pointeurs et listes chaînées
    Salut tout le monde!

    J'ai un petit soucis, je fais un programme avec des listes chaînées que je créé moi même sans utiliser la STL, et oui, je sais, mon prof' veut absolument que je gère les listes sans celles de la STL.
    J'ai deux petits soucis, mon premier est que je n'arrive pas à initialiser un pointeur à NULL. J'ai tout de suite une erreur m'indiquant que NULL n'est pas déclaré, pourtant, je dois parfois réinitialisé mes pointeurs de listes à NULL, par exemple, quand je supprime tous les éléments de la liste.

    next est un pointeur sur le maillon suivant de la liste chaînée, pourquoi je ne peux pas l'initialiser à NULL comme ça dans mon constructor ?


    Et mon deuxième problème est un petit peu plus conplexe, j'ai une abstract class Collection dont ma classe LinkedList est dérivée, pour celà, je dois implémenter toutes les pures virtuales fonctions de ma classe Collection dans ma classe LinkedList (add(),remove(),size()...).
    J'ai un petit soucis lorsque je souhaite implémenter la fonction add() appartenant à ma classe LinkedList, je n'arrive pas à faire pointer mon pointeur next au maillon précédemment créé. Voici mon code de la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    void LinkedList::add(int element){
    	Node* node = new Node;
    	if(isEmpty()){
    		firstNode = node;
    		lastNode = node;
    		node->setValue(element);
    		//node.setNext(NULL);
    	}
    	else{
    		firstNode = node;
    		node->setValue(element);
    		// TODO:
    		node->setNext(node->getNext()); // Faux!!
    	}
    	sizeList++;
    }
    Je veux ajouter un element dans ma list (un element "int").
    "firstNode" et "lastNode" sont deux maillons dans ma classe LinkedList et "node" est un pointeur sur un objet de la classe node (=maillon).
    La classe Node (=maillon) possède deux attributs: int value(champ data du maillon de la liste, Node* next (pointeur sur le prochain maillon de la liste).

    En espérant que vous pourrez m'aider, merci d'avance!
    A+

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par womannosky Voir le message
    J'ai tout de suite une erreur m'indiquant que NULL n'est pas déclaré,
    NULL est une macro définie entre autres dans <stddef.h>

    Et mon deuxième problème est un petit peu plus conplexe, j'ai une abstract class Collection dont ma classe LinkedList est dérivée, pour celà, je dois implémenter toutes les pures virtuales fonctions de ma classe Collection dans ma classe LinkedList (add(),remove(),size()...).
    J'ai un petit soucis lorsque je souhaite implémenter la fonction add() appartenant à ma classe LinkedList,
    Où est qu'il faut ajouter dans la liste?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    void LinkedList::add(int element){
    	Node* node = new Node;
    	if(isEmpty()){
    		firstNode = node;
    		lastNode = node;
    		node->setValue(element);
    		//node.setNext(NULL);
    	}
    	else{
    		firstNode = node;
    		node->setValue(element);
    		// TODO:
    		node->setNext(node->getNext()); // Faux!!
    	}
    	sizeList++;
    }
    Apparemment, tu veux ajouter en tête de liste. Donc le next du noeud ajouté doit être le précédant firstNode. Il faut donc l'assigner avant de remplacer firstNode par le nouveau noeud.

    (Pourquoi as-tu commenté le setNext(NULL)? à cause du problème ci-dessus?)

  3. #3
    Membre éprouvé
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    NULL est une macro définie entre autres dans <stddef.h>
    Oui, en C++ il faut mettre 0 (et dans la nouvelle norme C++0x, tu pourra utiliser nullptr).

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par bogoss91 Voir le message
    Oui, en C++ il faut mettre 0
    Pas plus qu'en C.

    NULL ne résouds pas tout les problèmes de 0 et en posent d'autres, d'où la proposition d'introduire nullptr, mais il est néanmoins valide et pas mal utilisé.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Merci pour la bibliothèque, en effet, je peux assigner NULL à mes pointeurs.
    Pour mon deuxième problème plus complexe, je veux ajouter en queue.
    Effectivement, j'ai commenté le setNext(NULL) avec le problème du NULL.

    J'aimerais donc ajouter en queue, mais je n'arrive pas à lier un maillon à l'autre par le pointeur next appartenant à la classe node (=maillon), je me rend compte que je me suis trompé dans ma fonction, firstNode est bien le pointeur qui pointe sur le premier maillon créé, il ne change donc plus après. C'est le pointeur lastNode que je dois réassigner à chaque nouvelle création. C'est pour cela que j'ajoute en queue et non en tête.
    Aurais vous une idée pour assigner mon pointeur next vers le maillon créé précédemennt ?
    Merci pour vos réponses.
    A+

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par womannosky Voir le message
    Merci pour la bibliothèque,
    Ce n'est pas une bibliothèque, c'est un entête.

    C'est le pointeur lastNode que je dois réassigner à chaque nouvelle création. C'est pour cela que j'ajoute en queue et non en tête.
    Aurais vous une idée pour assigner mon pointeur next vers le maillon créé précédemennt ?
    Si tu ajoutes en queue, tu n'as pas à faire pointer next vers le maillon créé précédemment, il faut le mettre à NULL parce qu'il n'y a rien après. Mais par contre tu dois modifier le next du maillon précédent pour le faire pointer vers le nouveau maillon.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Une entête ok, merci encore!
    Admettons une suite de maillons horizontaux, je souhaite ajouter un maillon à gauche de la suite de maillons, je ne sais pas si j'ajoute en tête ou en queue, firstNode pointe sur le maillon le plus à droite et lastNode sur celui le plus à gauche.
    Ce qui me parait logique, c'est d'assigner lastNode au next du nouveau maillon créé avant de le réassigner au maillon nouvellement créé, mais je n'arrive pas à le faire.
    Merci encore pour ton acharnement sur mon problème surement dérisoire.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Alors, est ce que quelqu'un aurait une idée pour chaîner ma liste dans mon cas ?
    Merci.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    C'est bien ce que j'avais dis, j'ai enfin trouvé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/03/2012, 00h26
  2. Liste chaînée sans pointeur
    Par lyes312 dans le forum Langage
    Réponses: 19
    Dernier message: 21/06/2008, 18h39
  3. Pointeur générique et liste chaînée
    Par jro-daemon dans le forum C
    Réponses: 9
    Dernier message: 23/02/2007, 14h06
  4. Construction de liste chaînées
    Par fomblardo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 15/03/2005, 21h19
  5. Insertion d'un noeud dans une liste chaînée
    Par habib106 dans le forum Assembleur
    Réponses: 8
    Dernier message: 07/04/2004, 22h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo