IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[Liste chaînée] Suppression d'un élement


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2012
    Messages : 7
    Par défaut [Liste chaînée] Suppression d'un élement
    Bonjour,

    Je souhaite supprimer un élément dans une liste chaînée, à l'aide de « rechercher »
    Voila le code. Merci de bien vouloir le corriger.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    etd *Recherche(etd *e1,int cn){
    etd *tmp=e1;
    while(tmp!=NULL){
    if(tmp->cne==cn){
    return tmp;
    }else{
    return NULL;
    }
    tmp=tmp->suivant;
    }
     
    }
     
    etd *Suprimer(etd *e1){
    etd *tmp=e1->suivant;
    int cn;
    printf("\n Donner le numero de l'etudiant a supprimer");
    scanf("%d",&cn);
    etd *r=Recherche(e1,cn);
    if(e1==NULL){
    printf("\nViiiiide!");
    }
    if(e1->cne==cn){
    tmp=e1->suivant;
    free(tmp);
    return e1;
    }
    else{
    if(r=NULL)
    printf("\nelement n'exist pas");
    else{
    while(tmp->suivant!=r){
    tmp=tmp->suivant;
    }
    tmp->suivant=r->suivant;
    free(r);
    return e1;
    }
    }
     
    }
    Voila la structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct etudiant etd;
    struct etudiant{
    int cne;
    char nom[20];
    char prenom[20];
    etd *suivant;
    };

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 312
    Billets dans le blog
    5
    Par défaut
    Dans la fonction recherche(); le code suivant est faux : if(tmp->cne==cn) return tmp; else return NULL;. Le else return NULL fait que ta fonction renvoie NULL si le premier élément de la liste ne correspond pas. Tu ne parcours donc pas toute la liste.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2012
    Messages : 7
    Par défaut
    voila la fonction editéé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    etd *Recherche(etd *e1,int cn){
        etd *tmp=e1;
        while(tmp!=NULL){
                         if(tmp->cne==cn){
                                          return tmp;
                                                   }
     
        tmp=tmp->suivant;  
                       }
        return NULL;
     
        }

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 312
    Billets dans le blog
    5
    Par défaut
    Dans la fonction supprimer(); il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      etd *r=Recherche(e1,cn);
     
      if(e1==NULL)
    Il me semble que ce n'est pas ce que tu veux faire. Vois-tu l'erreur ?

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2012
    Messages : 7
    Par défaut
    tu peux me donner le CORecct code plz

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 312
    Billets dans le blog
    5
    Par défaut
    recherche(); te renvoie un pointeur valide si l'étudiant est trouvé, NULL dans le cas contraire. Donc c'est le retour de cette fonction qu'il faut tester et non la validité de la liste chaînée.

    Si toutefois c'est bien la validité de la liste chaînée que tu veux faire alors ce test doit se trouver au début de la fonction supprimer(); et pas en son milieu.

    Une fois que tu auras tester le bon pointeur il faut se poser la question : que fait le test si la valeur est NULL ? Un joli texte s'affiche en console et après ? Pour l'instant le code qui se trouve en dessous de ce test est aussi exécuté. Pas forcément le but recherché.

    Il faut donc revoir un peu l'algo. de cette fonction.

Discussions similaires

  1. Suppression d'une cellule d'une liste chaînée
    Par uncline dans le forum Langage
    Réponses: 6
    Dernier message: 03/12/2013, 21h10
  2. Liste circulaire simplement chaînée : suppression
    Par azerty210 dans le forum Langage
    Réponses: 3
    Dernier message: 19/05/2013, 15h08
  3. [Turbo Pascal] Suppression d'éléments d'une liste chaînée simple
    Par gigimino dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 22/07/2011, 14h28
  4. Insertion d'un noeud dans une liste chaînée
    Par habib106 dans le forum Assembleur
    Réponses: 8
    Dernier message: 07/04/2004, 22h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo