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

GTK+ avec C & C++ Discussion :

Supprimer le 1er élément d'une liste chainée


Sujet :

GTK+ avec C & C++

  1. #1
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Points : 208
    Points
    208
    Par défaut Supprimer le 1er élément d'une liste chainée
    Bonjour,

    j'ai un GtkNotebook auquel j'ajoute des pages sur le clic d'un utilisateur. Afin de me simplifier la vie j'ai créé une structure onglet dans laquelle je stocke tous les widgets a afficher dans la page de mon notebook. (Jusqu'ici tout va bien !)
    Maintenant pour ajouter mes structures onglet, je les stocke dans une GList. (Simple à ajouter, simple à supprimer, excellent ) mais le hic c'est lorsque je dois supprimer le 1er onglet car dans ma liste chaînée, c'est le 1er pointeur que je supprime donc je perds toute la liste derrière.
    Voici ma fonction permettant de supprimer un onglet :
    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
    void            onglet_close(GList *active_tabs, gint nb)
    {
        GList *element = NULL;
     
        /* recherche de l'élément à supprimer */
        if(active_tabs != NULL && nb > -1)
        {
            /* element pointe sur l'élément de la liste qui contient l'onglet à supprimer */
            element = g_list_nth(active_tabs, nb);
     
            if(element != NULL)
            {
                /* suppression de l'élément */
                active_tabs = g_list_remove_link(active_tabs, element);
     
                /*
                    * element est maintenant une liste contenant un seul élément
                    * donc on le supprime de la mémoire
                */
                if(element != NULL)
                    g_list_free_1(element);
            }
        }
     
    }
    Avez vous une solution à me suggérer ?

    Merci de vos réponses

    Edit : en fait je voudrais savoir si je peux manipuler la liste chainée comme une liste normale?
    c'est-à-dire écrire une chose du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    GList *second = active_tabs;
     
    if(second != NULL)
         second = second->next;
     
    /* suppression ... */
     
    if(second != NULL)
         active_tabs = second;

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Je suis pas bien sûr de ce qui te pose pb, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     if(element != NULL)
            {
                /* suppression de l'élément */
                active_tabs = g_list_delete_link(active_tabs, element);
            }
    devrait faire l'affaire, si active_tabs ne comptait qu'un seul élément alors elle vaudra NULL après ce bloc de code.

  3. #3
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Points : 208
    Points
    208
    Par défaut
    le problème se pose lorsque j'ai plusieurs onglets et que je désire supprimer le premier élément, donc la tête de ma liste
    Je dois modifier le pointeur sur ma liste chainee pour le faire pointer sur le 2nd élément, puis supprimer le 1er élément
    C'est la mon problème

    EDIT: ta solution pose toujours un seg fault (g_list_delete_link)

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    A mon avis ton problème se situe ailleurs, si g_list_delete_link n'était pas capable de supprimer le 1er elt, elle n'aurait aucun intérêt à renvoyer une valeur...

  5. #5
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Points : 208
    Points
    208
    Par défaut
    et bien le truc c'est qu'ailleurs je n'ai pas ce problème... Le seul moment ou ça plante c'est lorsque j'ai plusieurs onglets ouverts et que je veux supprimer le 1er.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    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
     
    #include <glib.h>
     
    int main (int argc, char **argv)
    {
            GList *l = NULL;
            int i;
     
            for (i = 0; i < 15; ++i) {
                    l = g_list_prepend (l, GINT_TO_POINTER (i));
            }
     
            while (i > 0) {
                    g_assert (g_list_length (l) == i);
                    if (i == 1) {
                            g_print ("removing last element\n");
                    }
                    i--;
                    g_assert (GPOINTER_TO_INT (l->data) == i);
                    l = g_list_delete_link (l, l);
            }
            g_assert (l == NULL);
            g_print ("everything's ok\n");
            return 0;
    }
    Ca confirme que g_list_delete_link fonctionne bien sur le dernier element de la liste. Quand je parlais d'un pb "autre part", je pensais à un pointeur erroné, une corruption mémoire, ...

  7. #7
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Points : 208
    Points
    208
    Par défaut
    je n'ai pas dit que g_list_delete_link ne fonctionne pas !
    cependant, dans ton exemple tu pars de la fin et supprime les éléments un à un : cela marche aussi chez moi.
    Je ne parviens pas à trouver un moyen de supprimer le premier élément de ma liste, c'est tout !
    Ou bien j'ai peut-être mal compris ce que tu fais dans l'exemple

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Je remplis une liste avec 15 éléments, et ensuite je vide la liste en supprimant à chaque fois le premier
    Avant le while, la liste contient
    [14, 13, 12, ... 1, 0]
    Au premier passage dans le while, je vérifie que le premier elt de la liste est bien 14, je le supprime, je boucle.
    Au 2nd passage, vérif qu'on a bien 13 au début de la liste, suppression, boucle, ...
    Donc je supprime systématiquement le 1er elt de la liste et tout se passe bien.

  9. #9
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Points : 208
    Points
    208
    Par défaut
    je n'avais pas fait attention à la façon dont tu remplis la liste (g_list_prepend) au temps pour moi
    je vais retourné étudier mon code ....

Discussions similaires

  1. Ajouter un élément dans une liste chainée.
    Par fourize dans le forum Général Java
    Réponses: 7
    Dernier message: 12/05/2012, 10h26
  2. Suppression d'un élément dans une liste chainée
    Par jbarreau-mainson dans le forum Débuter
    Réponses: 1
    Dernier message: 06/05/2009, 15h49
  3. Réponses: 12
    Dernier message: 03/07/2008, 13h53
  4. Retourner le 1er élément d'une liste box
    Par soso78 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 16/03/2007, 20h46
  5. Réponses: 8
    Dernier message: 01/04/2006, 10h10

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