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 -
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 :

A voir également:

6 réponses

productif Messages postés 39 Statut Membre 20
 
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 423 Statut Membre 12
 
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 Statut Membre 20
 
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 423 Statut Membre 12
 
euh
0

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

Posez votre question
productif Messages postés 39 Statut Membre 20
 
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 423 Statut Membre 12
 
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