Depiler

Fermé
ahlam1 Messages postés 23 Date d'inscription mercredi 19 août 2009 Statut Membre Dernière intervention 1 avril 2011 - 7 févr. 2010 à 00:50
 ahlam! - 7 févr. 2010 à 16:59
Bonsoir,
j un problème dans ma fonction depiler code en c++
j fais une pile avec une liste chainee et la suppression et lajout se fais au dernier element de la pile (principe de la pile comme vous savez )
alors mon probleme c quand je fais une boucle while( !pile-vide()) cad tant que la pile n'est pa vide alors depiler
mais il me donne une boucle infinie donc il ne depile pas
donc le probleme est dand ma fonction depiler()
si qlqun peut m'aider a savoir ou est le probleme je serai tres reconnaissante
voici ma fonction depiler:
string Pile::depiler(string c)
{ Chainon* p;


p=ptete;
if(ptete== NULL) cout<<"la pile est vide "<<endl;
else{ if(p->getsuiv()==NULL){
c=p->getmot();
p=NULL;}

else {
cout<<"depiler depiler depiler"<<endl;
while(p->getsuiv()->getsuiv()!=NULL)

{

p=p->getsuiv();

}
c=p->getmot();
p->setsuiv(NULL);


}}

return c;//je retourne l'element qui a ete depiler c un string
};

merci d'avance

4 réponses

Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
7 févr. 2010 à 04:38
Bonjour

tout d'abord, avant de s'attaquer au problème je ne comprends pas pourquoi tu veux que la fonction reçoive un argument ("c"). Qu'elle renvoie l'élément qui a été dpilé, ok, mais pourquoi appeler la fonction en donnant un string en paramètre que tu n'utilises pas ?

Ensuite pour ton problème :

prenons le cas le plus simple au cas où la pile n'a qu'un élément :
p=ptete; 

...

    if(p->getsuiv()==NULL) {
        c=p->getmot();
        p=NULL;
    } 


p est une variable locale à la fonction.
lorsque tu fais p=NULL, ça ne fait que changer ce pointeur vers NULL. Avant il pointait vers ptete, ensuite il pointe sur rien du tout.
Toi, tu veux que ptete ne pointe plus sur rien...

Je te laisse corriger ça pour commencer.

Ensuite, pour le deuxième cas :


    while(p->getsuiv()->getsuiv()!=NULL) {
        p=p->getsuiv();
    }
    c=p->getmot();
    p->setsuiv(NULL); 


ici, lorsque la boucle s'arrette, p pointe sur le dernier élément de la liste. donc lorsque tu fais p->setsuiv(NULL); , ça ne fait rien du tout car l'élément suivant du dernier élément est déjà NULL. C'est l'avant dernier élément sur lequel tu dois appeler ->setsuiv(NULL) .
Je te laisse réfléchir et corrier.


PS : Attention ! Si tu crées tes chainons dynamiquement avec new, il faut penser normalement à appeler delete pour les supprimer de la mémoire (désallouer la mémoire), et ensuite de mettre ce qui pointe dessus à NULL.
0
bonjour,
merci pour votre repense
je savais que le p pointe sur le dernier element mais je ne sais pas comment le pointer sur l'avant dernier element pour le rendre a NULL.
si vous pouvez m'aider ca serai formidable car j bcp penser et essayer mais rien
merciiiiii
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
7 févr. 2010 à 14:55
en utilisant 2 pointeurs je pense que ça marche bien ;)

p1 = ptete
p2 = p1->getsuiv()

while(p2->getsuiv() != NULL ) {
     p1 = p2;
     p2 = p2->getsuiv();
}


à la sortie de la boucle, p1 pointe sur l'avant-dernier, et p2 sur le dernier.
je te laisse deviner ce qu'il faut faire ensuite.

PS encore une fois : ATTENTION ! tu devrais plutôt faire une fonction "supprSuiv()" au lieu d'appeler simplement "setSuiv(NULL)" tout seul, car tu dois surement faire des "delete" sur les chainons que tu enlèves ! Risque de bug de mémoire dans le système sinon.


Autre PS, plus fondamental concernant ton algorithme :

Je trouve tout de même bizarre tout ça.
Vu que dans une pile, on enlève toujours les éléments du même coté que là où on les ajoute, pourquoi ne pas avoir fait en sorte d'ajouter et de supprimer les éléments au début de la pile ? ça t'économise à chaque fois le fait de parcourir la pile en entier ! Si ta pile est de 100'000 éléments, tu ne feras que 1 ou 2 opérations apour enlever des éléments ou les ajouter, contre 100'000 ou 200'000 opérations si tu les mets à la fin !!!
0
merciiiiiiiiii,
ça a marcheeeeeeeeeeeeeeeeeeee
0