Page 1 sur 5 123 ... DernièreDernière
Résultats de 1 à 10 sur 45

Sujet : problème liste doublement chainée

  1. #1
    Membre MP
    Inscrit
    août 2013
    Messages
    17

    problème liste doublement chainée

    bonjour,
    j\'ai un problème avec la construction d\'une liste doublement chainée en visual c++:l\'Objectif est de créer une liste en inserant les nouveaux elements en tête de liste (les plus vieux se retrouvent à la queue). La liste est composé d\'Element :

    Class Element(
    CString name;
    int val;
    Element *next, *prec;
    )

    Declaration du constructeur de la classe Liste

    Liste::Liste()
    {
    head = new Element();
    courant = head;
    tail = head;
    nb = 0;
    }

    * Ajout du 1er element de la Liste

    void Liste::Add(Element* Obj)
    {
    head=Obj;
    tail=Obj;
    nb++;
    }

    *Ajout des éléments suivants en tête de Liste (cette methode est tjrs appelé après Add().

    void Liste::AddElementOnListHead(Element* Obj)
    {
    if (head !=NULL)
    {
    head->SetPrecedent(Obj);
    Obj->SetNext(head);
    }
    else
    {
    tail=Obj;
    }
    head=Obj;
    nb++;
    }


    A l\'affichage,je me rend compte que je me suis planté à quelque part.

    void List::Affichage()
    {
    CResource* temp;
    temp = head;

    while(temp!=NULL)
    {
    temp->afficher();
    temp=temp->GetNext();
    }


    Quelqu\'un peut il me dire ce qui va pas ?

    Merci à tous

  2. #2
    Membre MP
    Inscrit
    août 2013
    Messages
    627
    Faut pas tout metre a 0 quand tu construit?
    ... Until then, we're better off dead
    A smile on the lips and a hole in the head ...

  3. #3
    Membre MP
    Inscrit
    août 2013
    Messages
    17
    oué,j\'ai initialisé la liste...

  4. #4
    Membre MP
    Inscrit
    août 2013
    Messages
    627
    erf ok alors attendons quelqu un qui connais le c++
    ... Until then, we're better off dead
    A smile on the lips and a hole in the head ...

  5. #5
    Membre MP
    Inscrit
    août 2013
    Messages
    329
    Un probleme ici :

    Code:
    void Liste::AddElementOnListHead(Element* Obj)
    {
    if (head !=NULL)
    {
    head->SetPrecedent(Obj);
    Obj->SetNext(head);
    }
    else
    {
    tail=Obj;
    }
    head=Obj;
    nb++;
    }
    Si comme tu le dis cette methode est tjrs appelee apres Add(), la tete ne peut pas etre nulle. Sinon, precise quelles erreurs tu as, ainsi que les methodes de la classe Element que tu utilises sans nous donner leur declaration (on ne sait jamais d\'ou peut venir un bug).

  6. #6
    Membre MP
    Inscrit
    août 2013
    Messages
    6 517
    J\'ai peut etre un truc
    Code:
    Liste::Liste() 
    { 
    head = new Element(); 
    courant = head; 
    tail = head; 
    nb = 0; 
    }
    Tu fais pointer head vers l\"element crée par head. Puis
    Code:
    void Liste::Add(Element* Obj) { head=Obj; tail=Obj; nb++; }
    Tu fais pointer head vers un autre élément.
    Et courant continue à pointer vers un élément vide.
    Lisez la charte, pensez à regarder la FAQ, les tutoriaux, l'annuaire et faites une recherche dans les forums.
    N'oubliez pas le Tag [Résolu]http://www.ressources.moteurprog.com...rum/Resolu.gif.

    Initiez-vous à Delphi avec Turbo Delphi Explorer, au C ou au C++ avec Code::Blocks et C# avec Visual C# 2005 Express.

  7. #7
    Membre MP
    Inscrit
    août 2013
    Messages
    6 517
    Je ne sais pas ce que c\'est que tail donc je n\'en prends pas compte.

    Pour faire plus propre, je te conseille :

    Code:
    liste::liste()
    {
    head=NULL;
    courant=NULL;
    }
    
    liste::premier_el(objet* o);
    {
    head=o;
    courant=o;
    o->precedent = head;
    o->suivant=NULL;
    nb++;
    }
    
    liste::element_qq(oblet* o);
    {
    if (/* le bon truc a mettre */)
    o->suivant = head;
    head->precedent=o;
    head=o;
    nb++;
    }
    D\'ailleurs, tu peux facilement faire les deux fonctions en une (a moins que ce ne soit deja fait).

    Et avec un peu de rigueur (un tout petit peu), ut peux ajouter un élément à la place que tu veux, au milieu ou meme a la fin.

    Voila, en esperant que j\'ai pu t\'aider.
    Lisez la charte, pensez à regarder la FAQ, les tutoriaux, l'annuaire et faites une recherche dans les forums.
    N'oubliez pas le Tag [Résolu]http://www.ressources.moteurprog.com...rum/Resolu.gif.

    Initiez-vous à Delphi avec Turbo Delphi Explorer, au C ou au C++ avec Code::Blocks et C# avec Visual C# 2005 Express.

  8. #8
    Membre MP
    Inscrit
    août 2013
    Messages
    329
    tail c\'est la queue de liste, utilisee principalement pour ajouter des elements en fin de liste en O(1) et non en O(N), ce qui n\'est pas negligeable :wink:

    Par contre, je ne comprends pas ta version pac : la premier etait bonne, on alloue de la memoire pour la tete de file, puis on fait pointer les champs courrant et tail vers la tete, logique vu que la liste ne comporte qu\'un element.

    Par ailleurs, la fonction Add() devrait effectivement etre ajoutee au constructeur ou incluse dans les autres fonction d\'ajout, pour gagner en clarte surtt, mais aussi parcequ\'on est pas tjrs sur des utilisateurs de l\'API apres :wink:

  9. #9
    Membre MP
    Inscrit
    août 2013
    Messages
    6 517
    Hum, Tastalian, je crois qu\'on va ouvrir un débat.

    Liste::Liste()
    {
    head = new Element();
    courant = head;
    .....

    La il crée un élément vide pour la tête. Puis

    head=Obj;
    tail=Obj;
    ....

    La il fait pointer le poitneur head vers un objet créé ailleurs et à un autre moment.
    L\'ancien objet vide n\'est plus pointé. Il ne mets pas les éléments de Obj ds l\'ancien objet vide pointé.

    Il ne fait pas *head=*Obj mais bien head=Obj;

    A part si j\'ai raté un truc mais je ne pense pas.
    Ou bien il existe plusieurs méthode, ce qui est sur mais comme il a fait c\'est pas propre.

    De plus qd il fait la liste, rien ne sert de faireun objet vide, autant laisser les pointeurs vides et les faire pointer que qd il y a un nouveau objet.
    Non ?
    Lisez la charte, pensez à regarder la FAQ, les tutoriaux, l'annuaire et faites une recherche dans les forums.
    N'oubliez pas le Tag [Résolu]http://www.ressources.moteurprog.com...rum/Resolu.gif.

    Initiez-vous à Delphi avec Turbo Delphi Explorer, au C ou au C++ avec Code::Blocks et C# avec Visual C# 2005 Express.

  10. #10
    Membre MP
    Inscrit
    août 2013
    Messages
    329
    Il ne faut pas retirer les instructions de leur contexte :

    Code:
    // toujours effectue
    head->SetPrecedent(Obj);
    Obj->SetNext(head);
    
    head=Obj;
    nb++;
    Donc, l\'objet pointe par head n\'est plus en tete, et son predecesseur devient Obj. Ainsi, le suivant de Obj et l\'ancienne tete. On peut alors faire pointer head vers Obj, qui est la nouvelle tete. L\'espace memoire, anciennement pointe par head, conserve ces donnees, il ne faut pas le liberer, et il fait partie integrante de la liste. C\'est la le principe d\'une liste chainee, il n\'y a rien de mal a ca.

    A premiere vue, ca peut ressembler aux probleme que font souvent les debutants de ne pas allouer la memoire et de considerer un pointer comme un objet alloue en statique, mais en fait c\'est bien d\'arithmetique des pointeurs qu\'il s\'agit et ce code est correct.

    [PS] Par contre c\'est vrai, initialiser la tete avec un element vide ne sert pas a grand chose, meme si ca n\'a rien de faux, a moins qu\'il ne soit rempli par la suite. Dans tous les cas il est plus simple de laisser ces operations aux fonctions d\'ajout.

Page 1 sur 5 123 ... DernièreDernière

Informations du sujet

Utilisateur(s) parcourant ce sujet

il y a actuellement 1 utilisateur(s) parcourant ce sujet. (0 membre(s) et 1 visiteur(s))

Règles des messages

  • Vous ne pouvez pas créer de sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas importer de fichiers joints
  • Vous ne pouvez pas éditer vos messages
  •  
  • Les BB codes sont Activés
  • Les Smileys sont Activés
  • Le BB code [IMG] est Activé
  • Le code [VIDEO] est Activé
  • Le code HTML est Désactivé
Please disable Adblock!