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
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
Autres pages sur : probleme liste doublement chainee visual
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
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 !
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 !
Jette un coup d'oeil sur la STL
http://www.sgi.com/tech/stl/
En terme d'implémentation de ce genre de problématique ya pas d'équivalent. Et puis en plus c'est dispo avec les compilo (Visual C++, G++ ...)
#include <list>
list<MyElement> MyList;
MyList.push_front(MyElement(stuff, for, the, constructor));
http://www.sgi.com/tech/stl/
En terme d'implémentation de ce genre de problématique ya pas d'équivalent. Et puis en plus c'est dispo avec les compilo (Visual C++, G++ ...)
#include <list>
list<MyElement> MyList;
MyList.push_front(MyElement(stuff, for, the, constructor));
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 !
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 !
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
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 ?
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.
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumTri par insertion liste chainée
- ForumTri liste chainée java
- ForumSuppression dune structure dans une liste visual c
- ForumProblème microsoft visual c runtime
- ForumProblème visual studio 2005
- ForumVisual basic crã er liste
- ForumProbleme visual c
- ForumVisual car
- ForumProbleme liste excel
- ForumProbleme windows visual c
- Voir plus