Liste chaînées C
Résolu/Fermé
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
-
15 oct. 2008 à 09:55
didy_gwatinik Messages postés 352 Date d'inscription samedi 17 novembre 2007 Statut Membre Dernière intervention 30 mars 2010 - 15 oct. 2008 à 15:10
didy_gwatinik Messages postés 352 Date d'inscription samedi 17 novembre 2007 Statut Membre Dernière intervention 30 mars 2010 - 15 oct. 2008 à 15:10
A voir également:
- Liste chaînées C
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Liste groupe whatsapp - Guide
- Liste site streaming illégal - Accueil - Services en ligne
- Liste de diffusion whatsapp - Guide
5 réponses
Bonjour
Si tu n'as pas de pointeur pointant sur le précédent, tu peux quand même le retrouver en re-parcourant ta liste depuis le début et le mémoriser au passage.
Si tu n'as pas de pointeur pointant sur le précédent, tu peux quand même le retrouver en re-parcourant ta liste depuis le début et le mémoriser au passage.
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
15 oct. 2008 à 10:06
15 oct. 2008 à 10:06
donc en fait il faut que je fasse une variable temp qui va garder l'adresse du précédent tant que je n'ai pas trouvé le nom à supprimer c'est bien ça?
Ca serait plus simple avec un pointeur précédent? Ça représente beaucoup de choses à modifier?
Ca serait plus simple avec un pointeur précédent? Ça représente beaucoup de choses à modifier?
Oui, il suffit d'utiliser une variable temp.
Avec un pointeur "precedent", le code serait plus compliqué : ça fait des pointeurs en plus à mettre à jour en cas d'insertion et de suppression. Tu gagnerais en temps d'exécution dans le cas de l'effacement, mais je ne crois pas que ce soit un critère décisif.
Avec un pointeur "precedent", le code serait plus compliqué : ça fait des pointeurs en plus à mettre à jour en cas d'insertion et de suppression. Tu gagnerais en temps d'exécution dans le cas de l'effacement, mais je ne crois pas que ce soit un critère décisif.
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
15 oct. 2008 à 10:55
15 oct. 2008 à 10:55
J'ai essayé mais j'ai du faire une erreur car ca ne me supprime que pc->nom et pas le reste. Voilà mon bout de code, c'est pas très beau, je vais l'optimiser quand j'aurai bien compris le truc
Le souci aussi c'est que le pointeur ne pointe pas vers le suivant :(
void suppressionFiche() { char nom[20]; struct contact *prec; puts("Veuillez entrer le nom de la personne dont vous souhaitez supprimer les coordonnees"); memoireTampon(); gets(nom); pc=start; if(nbContact!=1) { do { fin=pc->next; prec=pc; pc=pc->next; if (strcmp(pc->nom,nom)==0) //le nom est le meme { break; } //ou pc=fin; }while(fin!=NULL); } else { do { if (strcmp(start->nom,nom)==0) //le nom est le meme { break; } //ou pc=fin; }while(fin!=NULL); } // on a le tmp dans lequel on a la valeur du pointeur precedent le pointeur a supprimer pc->next=prec->next; free(pc); }
Le souci aussi c'est que le pointeur ne pointe pas vers le suivant :(
prec->next=pc->next; me semblerait bien plus logique, non ?
A condition cependant de réfléchir un petit peu à ce qui se passe quand on supprime le premier de la liste, car prec n'est pas initialisé dans ce cas (et pas seulement dans le cas où il y a 1 seul contact).
A condition cependant de réfléchir un petit peu à ce qui se passe quand on supprime le premier de la liste, car prec n'est pas initialisé dans ce cas (et pas seulement dans le cas où il y a 1 seul contact).
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
15 oct. 2008 à 11:10
15 oct. 2008 à 11:10
oui en effet je viens de me rendre compte de cette erreur :s, pour la suppression du 1er ou dernier contact je pense que ce sera plus simple une fois que j'aurai géré la suppression au milieu. je vais voir si ca marche, je te tiens au courant.
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
15 oct. 2008 à 15:10
15 oct. 2008 à 15:10
Ca marche impec!! Merci beaaucoup :)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
15 oct. 2008 à 11:13
15 oct. 2008 à 11:13
sinon, tu test pc->next au lieu de tester pc, ainsi tu garde une trace du précédent (pc) :
if(pc->next.nom == nom_à_supprimer) //je sais c'est faux == comme ça, c'est juste pour l'algo
tmp=pc->next;
pc->next=pc->next->next;
free(tmp);
bien sur il faut faire attention aux effets de bord (si il faut supprimer la première fiche ou si pc->next->next n'existe pas) etc.
en ce qui concerne ton code, j'aurai fait l'inverse :
prec->next=pc->next; au lieu de pc->next=prec->next;
if(pc->next.nom == nom_à_supprimer) //je sais c'est faux == comme ça, c'est juste pour l'algo
tmp=pc->next;
pc->next=pc->next->next;
free(tmp);
bien sur il faut faire attention aux effets de bord (si il faut supprimer la première fiche ou si pc->next->next n'existe pas) etc.
en ce qui concerne ton code, j'aurai fait l'inverse :
prec->next=pc->next; au lieu de pc->next=prec->next;
15 oct. 2008 à 10:26