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
ahlam! - 7 févr. 2010 à 16:59
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
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 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 :
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.
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.
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
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
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
7 févr. 2010 à 14:55
en utilisant 2 pointeurs je pense que ça marche bien ;)
à 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 !!!
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 !!!