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 :

Supprimer valeur liste chaînée


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Supprimer valeur liste chaînée
    Bonjour à tous,

    J'essaye actuellement de coder une fonction supprimant la première instance d'une valeur passé en paramètre sur une liste chaînée.

    Voici mon code :

    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
     
    typedef struct cell
    {
        void *donnee;
        struct cell *next;
    } cell;
     
     
    typedef struct liste
    {
        cell *first; // Une liste est caractérisé par une cell de tête et de queue
        cell *last;
    } liste;
     
     
    int suppression_premiere_instance(liste *l, void *valeur)
    {
        cell *curr = l -> first; //curr est la première cellule
        cell *prev; //on crée une cellule prev
    	if (l -> first == NULL) //cas si la liste est vide
    	{
    	    return 0;
    	}
    	else if (curr -> donnee == valeur) //cas si la valeur recherchée est au début de la liste
    	{
    	    l -> first = curr -> next;
    	    free(curr);
    	    return 1;
    	}
        while ((curr -> next) != NULL) //autre cas. Tant qu'on est pas arrivé au bout de la liste
        {
           if (curr -> donnee == valeur) //si la valeur de la cellule est égale à la valeur recherchée
            {
                prev -> next = curr -> next; //on fait pointer prev vers la cellule pointé par curr
                free(curr); //on libère la cellule courante
                return 1;
            }
        curr = curr -> next; //on avance dans la liste
        }
    }
    Ca compile correctement mais ça ne fonctionne pas, je ne comprend pas vraiment pourquoi. Un coup de pouce ?

    Cordialement,

    KhaaB

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    prev n'est jamais initialisé.

    On a sans doute d'ailleurs intérêt à tester sur le maillon suivant et se dispenser de prev :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        while ((curr -> next) != NULL) //autre cas. Tant qu'on est pas arrivé au bout de la liste
        {
           if (curr -> next->donnee == valeur) //si la valeur de la cellule est égale à la valeur recherchée
            {
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Oui, pourquoi pas :

    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
     
    int suppression_premiere_instance(liste *l, void *valeur)
    {
        cell *curr = l -> first;
        cell *cnext = curr -> next;
    	if (l -> first == NULL)
    	{
    	    return 0;
    	}
    	else if (curr -> donnee == valeur)
    	{
    	    l -> first = curr -> next;
    	    free(curr);
    	    return 1;
    	}
        while (cnext != NULL)
        {
           if (cnext -> donnee == valeur) //Si curr -> next -> donnee
            {
                curr -> next = cnext -> next; //On fait pointer curr vers cnext next
                free(cnext);
                return 1;
            }
        curr = cnext;
        }
        return NULL;
    }
    Mais ne marche pas, qu'est ce qui ne va pas ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cell *cnext = curr -> next;
    et si ta liste est vide (curr == NULL) ?

    Sinon, tu n'effectues plus de parcours ici, tu mets à chaque itération curr à cnext.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Le cas où la liste est vide est pris en charge ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (l -> first == NULL)
    	{
    	    return 0;
    	}
    Je ne comprend pas ce que tu as dis Winjerome, cnext = curr -> next, il y a bien un parcours effectué non ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Sauf que tu le prends en charge après.
    Si ta liste est vide, tu auras cell *curr = l -> first; qui sera NULL, or ligne suivante, tu tentes de prendre curr -> next;.

    Citation Envoyé par KhaaB Voir le message
    , cnext = curr -> next, il y a bien un parcours effectué non ?
    Je ne vois pas de telle ligne dans ton while, d'où ma remarque.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    C'est juste, le cas de la liste vide et de la première cellule marche ici, mais autrement non :

    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
    int suppression_premiere_instance(liste *l, void *valeur)
    {
        cell *curr = l -> first;
    	if (l -> first == NULL)
    	{
    	    return 0;
    	}
    	else if (curr -> donnee == valeur)
    	{
    	    l -> first = curr -> next;
    	    free(curr);
    	    return 1;
    	}
        else
        {
            cell *cnext = curr -> next;
            while (cnext != NULL)
            {
               if (cnext -> donnee == valeur)
                {
                    curr -> next = cnext -> next;
                    free(cnext);
                    return 1;
                }
            curr = cnext;
            }
        }
     
    }

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ca ne marche pas, on a le même problème sur cnext qui reste inchangé à l'intérieur de la boucle while.
    Je voulais dire un code du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        while (curr->next != NULL)
        {
           if (curr->next->donnee == valeur)
            { 
                cell * p = curr->next ;            
                curr->next = p->next;
                free(p);
                return 1;
            }
            cur = cur->next;
        }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Oh oui, forcément quand on voit la réponse ça devient évident...merci d'avoir pris le temps de m'aider.


    Cordialement,


    KhaaB

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

Discussions similaires

  1. Liste Chaînée: Modifier valeur élément
    Par BBouille dans le forum Langage
    Réponses: 12
    Dernier message: 21/11/2013, 23h37
  2. [2.x] Supprimer une liste de valeur avec un Query Builder
    Par pmithrandir dans le forum Symfony
    Réponses: 1
    Dernier message: 02/06/2013, 20h09
  3. supprimer valeur d'une liste avec la touche "suppr"
    Par supertoms dans le forum VBA Access
    Réponses: 1
    Dernier message: 12/06/2008, 15h28
  4. Supprimer valeur dans zone de liste
    Par benjisan dans le forum Access
    Réponses: 3
    Dernier message: 27/06/2007, 14h45
  5. Réponses: 6
    Dernier message: 29/04/2007, 18h59

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