Suppresion dans une liste chaînée en C
Résolu
linkcr15
Messages postés
423
Statut
Membre
-
linkcr15 Messages postés 423 Statut Membre -
linkcr15 Messages postés 423 Statut Membre -
Bonjour,
Voila j'ai un problème pour manipuler une liste chaînée en C. Je souhaites rechercher et supprimer une valeur dans une liste. Ma fonction marche sauf quand la valeur recherchée est 1, là le programme plante en m'affichant plein de valeurs. Je pense que c'est un problème de pointeur mais je n'arrive pas à le résoudre. Voici mon code :
Voila j'ai un problème pour manipuler une liste chaînée en C. Je souhaites rechercher et supprimer une valeur dans une liste. Ma fonction marche sauf quand la valeur recherchée est 1, là le programme plante en m'affichant plein de valeurs. Je pense que c'est un problème de pointeur mais je n'arrive pas à le résoudre. Voici mon code :
A voir également:
- Suppresion dans une liste chaînée en C
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Liste code ascii - Guide
- Site dangereux liste - Guide
- Voir liste d'amis facebook - Guide
6 réponses
Désolé, mais ce code m'a l'air vraiment bancal:
- quand on trouve l'élément recherché, on fait ça:
L = L->suivant; ne sert à rien car immédiatement après, l'élément pointé par L est libéré de la mémoire
- et quand on ne trouve pas l'élément recherché, on fait ça:
autrement dit on modifie le pointeur sur l'élément suivant et on renvoie l'élément courant... qui n'est bien sûr pas l'élément recherché.
A ce stade là, autant tout reprendre de zéro... en s'aidant d'un petit dessin auparavant.
Déjà, je ne vois pas pourquoi on renverrait une donnée de type L_Couleur, si elle doit pointer vers un élément qu'on vient juste de libérer en mémoire... J'imagine plutôt que ce devrait être un booléen 1/0 qui indique si l'élément a été trouvé ou pas.
- quand on trouve l'élément recherché, on fait ça:
P = L; L = L->suivant; free(P); return L;
L = L->suivant; ne sert à rien car immédiatement après, l'élément pointé par L est libéré de la mémoire
- et quand on ne trouve pas l'élément recherché, on fait ça:
L->suivant = rechsuppr(L->suivant,val); return L;
autrement dit on modifie le pointeur sur l'élément suivant et on renvoie l'élément courant... qui n'est bien sûr pas l'élément recherché.
A ce stade là, autant tout reprendre de zéro... en s'aidant d'un petit dessin auparavant.
Déjà, je ne vois pas pourquoi on renverrait une donnée de type L_Couleur, si elle doit pointer vers un élément qu'on vient juste de libérer en mémoire... J'imagine plutôt que ce devrait être un booléen 1/0 qui indique si l'élément a été trouvé ou pas.
Je ne pense pas en ce qui concerne le L_Couleur car je recherche et je supprime la valeur dans la liste donc il faut bien que je la renvoie.
En ce qui concerne le code, j'ai beaucoup de mal avec les champs des structures (surtout avec L->suivant) je ne vois pas vraiment à quoi cela correspond, ainsi que la fonction free. Pouvez-vous m'éclairer svp?
En ce qui concerne le code, j'ai beaucoup de mal avec les champs des structures (surtout avec L->suivant) je ne vois pas vraiment à quoi cela correspond, ainsi que la fonction free. Pouvez-vous m'éclairer svp?
La définition de L_Couleur n'a pas été mise dans le code ; mais comme on trouve l'écriture L->suivant et L->val, de toute évidence, L_Couleur définit un type pointeur. Merci de donner la définition de L_Couleur, on y verra plus clair.
Concernant la valeur de retour, c'est à vous de définir ce que vous attendez en retour. Mais je ne comprends pas ce que la fonction doit retourner ; si c'est la valeur (val), c'est absurde puisque c'est un des paramètres d'entrée de la fonction ; si c'est le pointeur vers l'élément de la chaîne, c'est absurde aussi puisque qu'il est supprimé de la mémoire. Ca aurait du sens si ça retournait un autre élément de la structure, ou si ça retournait un booléen qui indique si "val" a été trouvé ou pas.
Concernant la valeur de retour, c'est à vous de définir ce que vous attendez en retour. Mais je ne comprends pas ce que la fonction doit retourner ; si c'est la valeur (val), c'est absurde puisque c'est un des paramètres d'entrée de la fonction ; si c'est le pointeur vers l'élément de la chaîne, c'est absurde aussi puisque qu'il est supprimé de la mémoire. Ca aurait du sens si ça retournait un autre élément de la structure, ou si ça retournait un booléen qui indique si "val" a été trouvé ou pas.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
pourquoi je ne peut pas supprimer le 1
=> en fait, au moment où suppr_val est appelée, le 1 est en tête de liste (c'est la dernière valeur ajoutée dans la liste). Une fois que cet élément est supprimé, la variable liste pointe toujours sur le même emplacement qui est désormais invalide. Par conséquent, afficherliste est appelée avec un paramètre invalide et c'est probablement pour ça que le programme fait n'importe quoi.
Mon conseil serait de faire en sorte que suppr_val renvoie:
- l'élément suivant, si l'élément supprimé est le premier
- le premier élément sinon
et d'écrire
=> en fait, au moment où suppr_val est appelée, le 1 est en tête de liste (c'est la dernière valeur ajoutée dans la liste). Une fois que cet élément est supprimé, la variable liste pointe toujours sur le même emplacement qui est désormais invalide. Par conséquent, afficherliste est appelée avec un paramètre invalide et c'est probablement pour ça que le programme fait n'importe quoi.
Mon conseil serait de faire en sorte que suppr_val renvoie:
- l'élément suivant, si l'élément supprimé est le premier
- le premier élément sinon
et d'écrire
liste = suppr_val (liste, 1);