Suppresion dans une liste chaînée en C

Résolu/Fermé
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 - Modifié par linkcr15 le 23/05/2011 à 18:04
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 - 21 mai 2011 à 20:32
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 :

6 réponses

productif Messages postés 39 Date d'inscription mardi 8 mars 2011 Statut Membre Dernière intervention 9 février 2017 20
16 mai 2011 à 18:15
Désolé, mais ce code m'a l'air vraiment bancal:

- 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.
0
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
17 mai 2011 à 16:55
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?
0
productif Messages postés 39 Date d'inscription mardi 8 mars 2011 Statut Membre Dernière intervention 9 février 2017 20
18 mai 2011 à 16:27
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.
0
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
Modifié par linkcr15 le 23/05/2011 à 18:05
euh
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
productif Messages postés 39 Date d'inscription mardi 8 mars 2011 Statut Membre Dernière intervention 9 février 2017 20
19 mai 2011 à 16:40
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
liste = suppr_val (liste, 1);
0
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
21 mai 2011 à 20:32
C'est bon en fait j'ai trouvé, comme productif l'a dis, j'appelais mal ma fonction... Résolu, à pour tout le monde =)
0