Se connecter avec
S'enregistrer | Connectez-vous

problème liste doublement chainée..visual c++

Dernière réponse : dans Programmation

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

Element::Element() // Constructeur par defaut
{
name="";
next= NULL;
prec= NULL;

}
void Element::SetPrec(Element * p) //positione l'element precedent
{
prec = p;
}

void Element::SetNext(Element * s) //positionne le suivant
{
next = s;
}

Element* Element::GetNext() //retourne l'element suivant
{
return next;
}


Element* Element::GetPrec() //retourne le precedent
{
return prec;
}


Declaration du constructeur de la classe Liste

Liste::Liste(Element* Obj)
{
nb=0;
Add(Obj);

}

void Liste::Add(Element* Obj)
{
head=Obj; //1er element=Obj -- head = tete et tail=queue
tail=Obj; //positionnement definitive de la queue de la liste,elle change plus
Obj->SetPrec(head);
Obj->SetNext(NULL);
nb++;
}

*Ajout des éléments suivants en tête de Liste (cette methode est tjrs appelé après Add().
void Liste::AddRElementOnListHead(Element* Obj)
{ //pas besoin de controle car head est deja positionné ..par Add()
head->SetPrec(Obj); //la tete devient le nouveau element
Obj->SetNext(head);
head=Obj;
nb++;
}


A l'affichage,je me rend compte que je me suis planté à quelque part.seul le 1er element est affiché mais en boucle infinie.

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

while(temp!=NULL)
{
temp->afficher(); //testé,fonctionne bien
temp=temp->GetNext();
}


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

Merci à tous
Lassé par la pub ? Créez un compte

Comment construis tu ta liste ?.
La fonction liste add ne fait pas de copie de donnees mais met uniquement a jour des pointeurs.
Si tu utilises une seule variable pour construire ta liste, tu obtiendras le resultat que tu decris.

Je m'explique, un truc du style

Element E;
init de E
Liste add(E)
Modif de E
Liste addRElementOnListHead(E)

fait que tu va te retrouver avec une "liste" d'un seul element
avec head = e
tail = e
head->suivant = head;

d'ou une boucle infinie sur head

Pourquoi vouloir refaire ce qui existe certainement déjà ??
Je pense que ça doit faire depuis que le C++ existe que des classes qui implémentent les listes à chaînage double sont disponibles.
A mon avis, tu as tout intérêt à faire une petite recherche sur google. J'ai déjà trouvé une classe générique (avec template) sur http://www.programmersheaven.com/zone3/cat451/21514.htm. Il doit surement y avoir d'autres classes disponibles sur www.codeproject.com ou www.cpp-home.com pour ne citer qu'eux... il y a des centaines de sites consacrés à la programmation !

m0rbac a écritPourquoi vouloir refaire ce qui existe certainement déjà ??
Je pense que ça doit faire depuis que le C++ existe que des classes qui implémentent les listes à chaînage double sont disponibles.
A mon avis, tu as tout intérêt à faire une petite recherche sur google. J'ai déjà trouvé une classe générique (avec template) sur http://www.programmersheaven.com/zone3/cat451/21514.htm. Il doit surement y avoir d'autres classes disponibles sur www.codeproject.com ou www.cpp-home.com pour ne citer qu'eux... il y a des centaines de sites consacrés à la programmation !


:non: 

Vu comme ça, ben tu apprends jamais a programmer du coup.

Pourquoi refaire ? Pour savoir faire.

Je précise quand même que l'interet de l'exercice c'est que les listes chainées ça fait partie des bases. Et que tôt ou tard il faudra bien les maitriser. Et quoi de mieux que d'écrire ses propres classes pour apprendre a maitriser tout ça ?

Sr17 a écrit:non: 

Vu comme ça, ben tu apprends jamais a programmer du coup.

Pourquoi refaire ? Pour savoir faire.

Je précise quand même que l'interet de l'exercice c'est que les listes chainées ça fait partie des bases. Et que tôt ou tard il faudra bien les maitriser. Et quoi de mieux que d'écrire ses propres classes pour apprendre a maitriser tout ça ?


Bon ok, vu comme ça je comprends. D'ailleurs personnellement je ne me rappelle plus le nombre de fois où j'ai dû implémenter des listes simplement et doublement chaînées avec sentinelles et tout le toutim.
Je disais ça simplement pour le cas où ismo voulais pouvoir bénéficier d'un outil simple et efficace.
A part ça, je pense que c'est également une chose très importante que de savoir utiliser du code existant, d'être capable de comprendre un algorithme, d'en saisir la subtilité ou même plus simplement de savoir l'utiliser efficacement. C'est à mon avis une excellente manière d'apprendre.

je suis tout à fait d'accord. Mais moi ce que je voudrai savoir c'est que si cette classe est valable aussi pour créer une liste de stations de métro. :sarcastic: 
Merci de me répondre au plus vite et de bien vouloir m'aider.

Une debutante en programmation desespéréé!! :??: 
Lassé par la pub ? Créez un compte