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
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
A voir également:
- Suppresion dans une liste chaînée en C
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Gertrude a préparé la liste des affaires à prendre pour l'excursion. juliette a modifié cette liste en utilisant le mode suivi des modifications proposé par le traitement de texte. - Guide
- Liste site streaming illégal - Accueil - Services en ligne
- Liste groupe whatsapp - Guide
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
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:
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.
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
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?
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?
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
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.
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.
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
Modifié par linkcr15 le 23/05/2011 à 18:05
euh
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
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
=> 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);
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
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 =)