liste simplement chainée , supprimer un element - C - Programmation
Marsh Posté le 16-12-2007 à 00:20:35
Boaf moi je vois déjà 2 problèmes
1) quand tu cherches ton mot, si le mot n'y est pas tu ne t'arrêtes jamais
2) quand tu libères ton élément contenant le mot, tu ne mets pas à jour le next de l'élément précédent
Pour le reste je pige rien à ton algo mais c'est peut-être parce qu'il a trop de commentaires...
int desallocmot(char *mot,cell *motavant) |
Marsh Posté le 16-12-2007 à 12:16:21
Sve@r a écrit : Boaf moi je vois déjà 2 problèmes |
Pour le 2, en principe si, car il faisait d'une part lors de la recherche: tmp=motavant
et plus tard, avant le free tmp->nxt=motasuppr->nxt.
Mais je suis d'accord avec toi, son algo est suffisament boursouflé pour qu'on ne voie pas bien les problemes qu'il peut poser.
Code :
|
Algo modifiable selon que
1- on est certain que l'on aura jamais current->mot a nil (par exemple si c'est un tableau de chars dans la structure cell). On pourrait aussi modifier l'algo pour sauter les cellules qui ont current->mot à nil. Tout dépend du problème concret.
2- on est certain que l'on aura jamais mot et liste a nil avant l'appel de la fonction
Noter que desallocmot ne retire qu'une seule fois le mot de la liste.
S'il peut apparaitre plusieurs fois, et que toutes les occurences doivent en être retirées, il y a la solution bourine d'appeller recursivement desallocmot, et la solution intelligente d'adapter l'algo, et de n'appeller qu'une seule fois la fonction.
A+,
Marsh Posté le 16-12-2007 à 13:03:12
Pour mon algo qui est trop boursouflé je suis d'accord c'est d'ailleurs en partie la raison pour laquelle je me tournais vers vous
Mais donc on a pas à géré si le mot est en début de liste ou pas ?
Marsh Posté le 16-12-2007 à 13:35:27
C'est géré ainsi:
for (current=liste, previous=NULL;
current && current->mot && !strcmp(mot, current->mot);
Si ton mot est en tete de liste, tu va t'arreter tout de suite, car strcmp(mot, current->mot) renvoie 0.
A ce stade, tu as donc current=liste et previous=NULL
Cas qu'on considere ici:
if (current && current->mot)
{
if (previous)
previous->next=current->next;
mais tu as raison, dans l'algo, il faut remettre liste a l'élément qui suit la tete de liste (et s'il n'y en a pas, la liste vas être mise a nil, qui est ce que l'on veut).
et il faudrait donc mieux réécrire le bout correspondant de l'algo comme:
Code :
|
J'ai été mettre a jour mon post précédent à ce sujet.
A+,
Marsh Posté le 16-12-2007 à 13:58:47
merci beaucoup gilou c'est plus clair dans ma tête maintenant
Marsh Posté le 15-12-2007 à 14:56:09
Bonjour,
Je viens vous demander de l'aide sur un petit problème qui me bloque depuis quelques heures
Valgrind me signale une erreur de lecture sur un de mes free de ma fonction et je n'arrive pas à trouver pourquoi.
Cette fonction desalloue la cellule qui contient le mot que je lui envois en paramètre.
Merci d'avance de votre aide