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 :

Problème avec une liste chaînée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 84
    Par défaut Problème avec une liste chaînée
    Bonnour à tous

    je rencontre un petit problème avec l'écriture d'une fonction de suppression d'un nième élément d'une liste chaînée :

    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
     
    typedef struct Element Element;
    struct Element
    {
        int nombre;
        Element *suivant;
    };
     
     
     
     
     
    typedef struct Liste Liste;
    struct Liste
    {
        Element *premier;
    };
     
    void suppression_element_rang(Liste *liste , int rang)
    {
        if (liste == NULL)
        {
            exit(EXIT_FAILURE);
        }
     
        int position=1;
        Element *actuel = liste->premier;
     
        while (position < rang)
        {
            actuel = actuel->suivant;
            position++;
        }
     
        Element *aSupprimer = actuel;
        actuel = actuel->suivant;
        free(aSupprimer);
     
    }
    lorsque je demande ensuite au programme d'afficher la liste dont j'ai supprimé un des éléments à l'aide de cette fonction, ça vire en une boucle interminable. pourriez-vous m'aider?

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Tu oublie de dire au prédécesseur qu'il doit maintenant pointer vers le suivant de son suivant (s'il existe) !

    En gros, tu dois garder un 2e pointeur sur l'élément précédent, et quand tu trouves sur "actuel" l'élément à supprimer...
    Sur le précédent, tu mets à jour le membre "suivant" de la structure vers le "suivant" de "actuel", puis tu peux supprimer "actuel"

    EDIT : dis comme ça c'est tordu...
    Mais pense à l'élément "avant" celui à supprimer.
    Et aussi : et si l'élément à supprimer et la tête de la liste ?
    Et si l'élément à supprimer est le dernier ?
    Ou l'avant dernier ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Metalman Voir le message
    Et si l'élément à supprimer est le dernier ?
    Ou l'avant dernier ?
    Salut

    Dans ces deux cas il n'y a rien de spécial à faire. Si l'élément à supprimer est le dernier, alors son next est à nul et ce nul est répercuté sur le next du prédécesseur lors de la recopie.
    Et il n'y a aucune différence entre l'avant dernier et un autre (autre que le premier ou le dernier).

    Le vrai problème de la suppression se situe en fait sur le premier. A ce moment là, la tête de liste récupère le second élément. Le soucis, c'est que généralement chez les débutants, la tête de liste est déjà un pointeur. Donc si la suppression se fait dans une fonction dédiée, cette fonction devant modifier le pointeur tête de liste devra recevoir un pointeur de pointeur sur cette tête.

    Heureusement, ici Frednight a pensé à intégrer la tête de liste dans une autre structure dédiée, elle, à décrire la liste elle-même (et non un de ses maillons). Déjà cela permet en plus d'intégrer d'autres outils (comme la taille de la liste, ou autres) et toute fonction recevant un simple pointeur sur cette structure pourra modifier le premier sans avoir à se coltiner des doubles étoiles...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Oui... mais maintenant il faut qu'il rajoute les quelques cas dans son code... donc je lui ai donné quelques questions à se poser, et la raison de sa boucle infinie.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par Frednight Voir le message
    Bonnour à tous

    je rencontre un petit problème avec l'écriture d'une fonction de suppression d'un nième élément d'une liste chaînée :
    [...]
    lorsque je demande ensuite au programme d'afficher la liste dont j'ai supprimé un des éléments à l'aide de cette fonction, ça vire en une boucle interminable. pourriez-vous m'aider?
    Bonjour,

    le problème vient principalement de la ligne actuel=actuel->suivant. Cette ligne ne modifie en rien ta liste. Faisons un petit dessin, il faut toujours faire un petit dessin avec les listes

    Voilà en gros l'état de tes structures de données et de tes variables un fois l''élément à supprimer est trouvé. Ensuite tu crées un nouveau pointeur aSupprimer et tu fais avancer actuel.

    Tu libères la mémoire allouée pour i+1, mais à aucun moment tu ne fais pointer i.next vers i+2 ... PROBLÈME !!!

    En plus des remarques justifiées de metalman (attention lorsque la liste ne contient qu'un élément, etc ...) il est important de comprendre que supprimer un élément d'une liste revient à trouver le père de cet élément et de faire pointer son next vers son petit fils (avec la remarque que tous doivent exister etc ...). En gros supprimer le lien rouge et créer le bleu :

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Ou bien, bosser en indirect, en pointant sur les pointeurs:



    Cela permet de modifier directement le pointeur pointant sur l'objet qu'on sort de la liste, et le forcer à pointer sur l'objet suivant.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 84
    Par défaut
    merci à tous pour vos réponses qui m'ont énormément aidé à cerner le problème

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/10/2007, 21h57
  2. Problème avec une liste.
    Par Baban29 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 26/04/2007, 12h12
  3. STL Problème avec une liste d'instances de class
    Par BruceBoc dans le forum SL & STL
    Réponses: 12
    Dernier message: 16/02/2007, 14h12
  4. [TP 7] Problème avec les listes chaînées (error 202)
    Par thelinekioubeur dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 06/12/2006, 23h15
  5. [Débutant] problème avec une liste déroulante
    Par stan21 dans le forum Access
    Réponses: 3
    Dernier message: 12/07/2006, 14h52

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