Problème en liste chaînée

Fermé
man r. Messages postés 11 Date d'inscription samedi 30 mars 2013 Statut Membre Dernière intervention 1 juin 2013 - 30 mai 2013 à 10:35
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 - 30 mai 2013 à 16:29
je ne comprends pas où est l'erreur dans cet algo ayant pour fonction de supprimer un élément d'une liste chaînée, merci d'avance de me la préciser :) !

struct cellule{
       int valeur;
       struct cellule *suivant;
};
typedef struct cellule *liste;
struct Tete{
       liste premier;
};
typedef struct Tete Tete;
void supprimer(Tete *tete,int pos){
     int x=0,c=0;
     printf("\nsupprimer un nombre de position \n");
     printf("entrer la position\n");
     scanf("%d",&pos);
     liste element=(liste)malloc(sizeof(struct cellule));
     liste asupprimer=(liste)malloc(sizeof(struct cellule));
     liste aide=(liste)malloc(sizeof(struct cellule));
     element=tete->premier;
     while(element->suivant!=NULL){
          if((pos+1)==x){
               asupprimer=element;
               element=tete->premier;
               while(element->suivant!=NULL){
                    if((pos-1)==c){
                         aide=element->suivant;
                         break;
                    }
                    c++;
                    element=element->suivant;
               }
               break;
          }
          x++;
          element=element->suivant;
     }
     aide=asupprimer;
     free(asupprimer);
     printf("\n");
}

1 réponse

Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
30 mai 2013 à 16:29
Bonjour,
Vous n'avez pas besoin d'allouer de la mémoire pour une suppression le but c'est d'en libérer.
Si c'est en fonction d'une position parcourir la liste tant qu'on ne tombe pas sur la fin (NULL) la position est ok sinon position dépasse la liste, sauvegarder dans un pointeur l'adresse précédente de l'actuelle durant le parcourt de la liste, lorsque la position est atteinte vous prenez l'adresse qui se trouve dans le pointeur suivant de l'actuelle et la mettez dans le pointeur suivant de l'adresse précédente qui est sauvegardée, quand ça c'est fait vous pouvez free l'adresse actuelle.
on veut sup n2 à la position deux, partant de zéro :
tete_n0 -> n1 -> n2 -> n3 -> NULL
précédant n2 c'est n1, le suivant de n2 c'est n3
on place n2->suivant (n3) dans n1->suivant on free n2, résultat :
tete_n0 -> n1 -> n3 -> NULL
0