Rechercher : dans
Par :

Liste chaînées C

Dernière réponse le 15 oct 2008 à 15:10:18 didy_gwatinik, le 15 oct 2008 à 09:55:35 
 Signaler ce message aux modérateurs

Bonjour,
Je suis en train de faire un carnet d'adresse n liste chainees donc j'ai declaré ma structure comme suit :

struct contact
      {
             char nom[20];
             char prenom[20];
             char numTel[11];
             char mel[50];
             char motdepasse[21];
             struct contact *next; //pointe sur l'adresse du suivant
      }*pc,*start,*fin; //pointeur de type contact : pointeur courant, pointeur pour le début et pour la fin

Jusque la tout va bien, mais je voudrai supprimer un élément, comment faire sachant que je n'ai pas de pointeur pointant sur un précédent? Est ce obligatoire?! Si oui, quelqu'un pourrait-il m'aider?
Configuration: Windows XP
Firefox 3.0.3

Meilleures réponses pour « Liste chaînées C » dans :
Liste simplement chaînée VoirLISTES SIMPLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes chaînées A. Initialisation B. Insertion d'un élément dans la liste 1. Insertion...
Les templates en C++ VoirIntroduction Avantages Inconvénients Quand utiliser des templates ? Que dois-je mettre dans les .hpp et dans les .cpp ? Convention de notations Quelques templates célèbres STL BGL Premiers pas Spécifications de templates Template par...
Liste doublement chaînée VoirLISTES DOUBLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes doublement chaînées A. Initialisation B. Insertion d'un élément dans la liste 1....
Langage C - Les listes chaînées VoirLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...

1

toto, le 15 oct 2008 à 10:02:45

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.

Répondre à toto

3

didy_gwatinik, le 15 oct 2008 à 10:26:53

Je n'y arrive pas, tu peux m'aider stp?

Répondre à didy_gwatinik

2

didy_gwatinik, le 15 oct 2008 à 10:06:16

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?

Répondre à didy_gwatinik

4

toto, le 15 oct 2008 à 10:42:43

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.

Répondre à toto

5

didy_gwatinik, le 15 oct 2008 à 10:55:58

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

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

Répondre à didy_gwatinik

6

toto, le 15 oct 2008 à 11:08:52

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).

Répondre à toto

7

didy_gwatinik, le 15 oct 2008 à 11:10:52

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.

Répondre à didy_gwatinik

9

 didy_gwatinik, le 15 oct 2008 à 15:10:18

Ca marche impec!! Merci beaaucoup :)

Répondre à didy_gwatinik

8

Char Snipeur, le 15 oct 2008 à 11:13:39

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; Salutation !  avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur