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 chainé supprimer un element


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 57
    Points
    57
    Par défaut Liste chainé supprimer un element
    Bonsoir a tous,
    Voila j'ai une erreur de segmentation je ne comprends pas trop d'ou elle vient.
    Merci d'avance

    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
     
    typedef struct cellule
    {
     int Val;
     struct cellule * Suiv;
    }Cellule, *Liste;
     
     
    int EffaceElement(Liste *l, int val)
    {
     Liste tmp, ptr;
     if (*l==NULL) return 0;
     if ((*l)->Val==val)
       {
        ptr=*l;
        *l=(*l)->Suiv;
        free(ptr);
        return 1; /* Succes */
       }
     while (*l != NULL && (*l)->Val != val)
         (*l)=(*l)->Suiv;
     if ((*l) == NULL) 
       return 0; /* Echec */
     printf("***");
     tmp=(*l)->Suiv;
     (*l)->Suiv=(*l)->Suiv->Suiv;
     free(tmp);
     return 1;
    }

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     while (*l != NULL && (*l)->Val != val)
         (*l)=(*l)->Suiv;
    Très mauvais, ça: Tu modifies le pointeur original, alors que tu ne dois le modifier que si tu supprimes le premier élément.

    Edit: Voici ma version de la fonction de suppression. Un algorithme plus simple, mieux commenté, et avec des noms de variable plus explicites:
    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
    int EffaceElement(Liste *ppListe, int val)
    {
    	if(ppListe==NULL)
    		return 0;
     
    	/* Variables locales */
    	{
    		/* Recherche */
    		Liste *ppModif = ppListe;
    		Liste pCur = *ppModif;
    		while(pCur!=NULL && pCur->Val != val)
    		{
    			ppModif = &pCur->Suiv;
    			pCur = *ppModif;
    		}
    		/* Ici, soit pCur est nul, 
    		soit pCur pointe sur l'élément à supprimer 
    		et ppModif sur le pointeur qui pointait dessus*/
    		if(pCur==NULL)
    			return 0;
     
    		/* Supprime l'élément de la liste */
    		*ppModif = pCur->Suiv;
    		/* Détruit l'élément supprimé */
    		free(pCur);
    	}
    	return 1;
    }

  3. #3
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 57
    Points
    57
    Par défaut
    Merci beaucoup ca marche parfaitement
    C'est effectivement plus claire

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut
    Je viens de voir le topic et je voulais savoir.

    Soit premier le première élement de la liste et second le suivant.
    premier->suivant et second on la même adresse mémoire
    ou
    premier->suivant contient l'adresse mémoire de second ?

    [EDIT]
    Donc si jamais le cas deux s'applique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    *ppModif = pCur->Suiv ;
    ppModif correspond à l'adresse mémoire Suiv de l'élément pCur précédent ? ( ) je ne sais pas si ma question est clair ?
    Donc ce que nous pourrions faire aussi c'est stocker l'élément précédent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    precedent->Suiv = pCur->Suiv ;
    free(pCur) ;

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Il n'y a ni premier ni suivant ni second dans le code...
    Cellule *second;
    Cellule *premier;
    premier->Suiv = second
    premier->Suiv == second, c'est le principe des listes chaînées. Un élement pointe sur le suivant.

    Donc ce que nous pourrions faire aussi c'est stocker l'élément précédent
    Et si l'élément précédent n'existe pas ? On fait comme précédemment. Mais pourquoi pas avec une liste doublement chaînée.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut
    merci

    [EDIT]
    Dernière question est c'est bon. Tout ceci est possible car :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct cellule
    {
     int Val;
     struct cellule *Suiv;
    }
    Par contre si nous avions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct cellule
    {
     int Val;
     struct cellule Suiv;
    }
    Nous n'aurions pas pu le faire ou les adresses mémoire seront égal encore ?

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Nous n'aurions pas pu le faire (ce serait une structure se contenant elle-même).

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par damien77 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct cellule
    {
     int Val;
     struct cellule Suiv;
    }
    Sauf erreur de ma part, ça ne compile même pas...

    Thierry

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [langage] Supprimer un élément dans une liste
    Par myjuna dans le forum Langage
    Réponses: 15
    Dernier message: 06/08/2014, 11h49
  2. supprimer un element de la liste
    Par ralf91 dans le forum C#
    Réponses: 5
    Dernier message: 21/04/2008, 22h15
  3. Supprimer le 1er élément d'une liste chainée
    Par bit_o dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 02/06/2007, 01h05
  4. Réponses: 5
    Dernier message: 08/02/2007, 18h13

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