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+ Discussion :

[GTK] Piles avec listes chainees


Sujet :

GTK+

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Par défaut [GTK] Piles avec listes chainees
    Bonsoir,

    J'ai tenté de coder la fonction empiler et dépiler en GTK, cependant lorsque je compile, le programme plante. Je pense que ceci est du à ma fonction dépiler que j'ai du mal à coder. Serait-il possible que vous m'expliquiez mes erreurs svp ? A dire vrai j'ai pas mal de lacunes en ce qui concerne les listes chainées.
    Merci

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
     
     
    //typedef
    struct GSList{
      gint donnee;
      struct GSList *suivant;
    };
    //GSList;
     
    typedef struct ListeRepere{
      struct GSList *debut;
      int taille;
    } t_liste;
     
     
    /* initialisation */
    void initialisation (t_liste *tas);
     
    /* EMPILER*/
    int empiler (t_liste *tas, gint donnee);
     
    /* DEPILER*/
    int depiler (t_liste *tas);
     
    /* Affichage de élément en haut de la pile (LastInFirstOut) */
    #define pile_donnee(tas)  tas->debut->donnee
     
    /* Affiche la pile */
    void affiche (t_liste *tas);
     
     
    void initialisation (t_liste * tas){
      tas->debut = NULL;
      tas->taille = 0;
    }
     
    /* empiler (ajouter) un élément dans la pile */
    int empiler (t_liste * tas, gint donnee)
    {
      struct GSList *nouveau_element = NULL;
     
     
      nouveau_element = g_slist_append(nouveau_element,(gint*)donnee);
     
      nouveau_element->suivant = tas->debut;
      tas->debut = nouveau_element;
      tas->taille++;
    }
     
    /* depiler (supprimer un élément de la pile */
    int depiler (t_liste * tas){
      struct GSList *supp_element;
      if (tas->taille == 0)
        return -1;
     
      supp_element = (gint*)g_slist_nth_data(supp_element, tas->debut->donnee);
     
      tas->debut->donnee = (gint*)(supp_element->donnee);
     
      supp_element = g_slist_remove(supp_element, (gint*)tas->debut->donnee);
     
     
      tas->debut = tas->debut->suivant;
      g_slist_free (&supp_element->donnee);
      g_slist_free (supp_element);
      tas->taille--;
      return 0;
    }
     
    /* affichage de la pile */
    void affiche (t_liste * tas){
      struct GSList *courant;
      gint i;
      courant = tas->debut;
     
      for(i=0;i<tas->taille;++i){
        g_print("\t\t%d\n", courant->donnee);
        courant = courant->suivant;
      }
    }
     
    int main (int   argc,char *argv[])
    {
      t_liste *tas;
      gint valeur;
     
      GtkWidget *pWindow;
     
     
      gtk_init(&argc, &argv);
     
      pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
      gtk_window_set_title(GTK_WINDOW(pWindow), "Le widget GtkEntry");
      gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
      //g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
     
      if ((tas = (t_liste *) malloc (sizeof (t_liste))) == NULL)
        return -1;
     
      initialisation (tas);
     
     
      g_print ("Entrez un nombre : ");
      scanf ("%d", &valeur);
      empiler (tas, valeur);
      g_print ("La pile (%d elements): \n",tas->taille);
      g_print("\n********** Haut de la PILE **********\n");
      affiche(tas);
      g_print("__________ Bas de la PILE __________\n\n");
     
      g_print ("Entrez un nombre : ");
      scanf ("%d", &valeur);
      empiler (tas, valeur);
      g_print ("La pile (%d elements): \n",tas->taille);
      g_print("\n********** Haut de la PILE **********\n");
      affiche(tas);
      g_print("__________ Bas de la PILE __________\n\n");
     
      g_print ("Entrez un nombre : ");
      scanf ("%d", &valeur);
      empiler (tas, valeur);
      g_print ("La pile (%d elements): \n",tas->taille);
      g_print("\n********** Haut de la PILE **********\n");
      affiche(tas);
      g_print("__________ Bas de la PILE __________\n\n");
     
     
      g_print ("\nLe dernier entre est supprime\n");
      depiler (tas);              // suppression de dernier element entre
      g_print ("La pile (%d elements): \n",tas->taille);
      g_print("\n********** Haut de la PILE **********\n");
      affiche(tas);
      g_print("__________ Bas de la PILE __________\n\n");
     
     
      gtk_widget_show(pWindow);
     
      g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
     
      gtk_main();
      return EXIT_SUCCESS;
    }

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    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 309
    Billets dans le blog
    5
    Par défaut
    Pour commencer tu définies une structure qui s'appelle GSList. Ce type de donnée est déjà définie par la GLib. Je pense que ca doit déjà poser pas mal de problèmes au compilateur .

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Par défaut
    J'ai modifié le nom de la structure mais en compilant j'ai beaucoup des erreurs alors qu'avant je n'avais que des warnings. Merci tout de même pour la réponse.

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    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 309
    Billets dans le blog
    5
    Par défaut
    Pour te donner une idée de la déclaration en voila une typique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct {
      gint donnee;
      struct SPile *suivant;
    }SPile;
     
    typedef struct {
      SPile *debut;
      gint taille;
    } t_liste;

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Par défaut
    Merci beaucoup ! Mais en modifiant, j'obtiens cette erreur lorsque je compile :
    Z:\ESSAI PILE\main.c|67|error: dereferencing pointer to incomplete type.

    Je ne vois pas où se situe le problème de pointeurs.
    Pourriez-vous m'éclairer svp ?

    Merci d'avance.

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    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 309
    Billets dans le blog
    5
    Par défaut
    En regardant ton code je ne comprends pas bien où tu veux en venir.

    Pour faire une pile FIFO ou LIFO avec une liste chaînée c'est relativement simple.
    Les GList et GSList de la GLib mettent à ta disposition différentes fonctions qui simplifient grandement la gestion. Par exemple tu peux savoir à tout moment le nombre d'éléments inclus dans la liste, tu peux extraire le premier élément, le dernier élément au choix. La seule gestion personnelle est la limitation du nombre d'éléments que tu veux.

    En partant de ce principe la structure t_liste est inutile. Le pointeur suivant dans la structure SPile est aussi inutile puisque la GSList (ou GList) gère tout ca pour nous. En résumé la structure SPile est aussi inutile. Seul un pointeur valide sur int est nécessaire.

    Une fois le constat fait on peut maintenant nettoyer le code .

Discussions similaires

  1. Tri d'une pile avec liste simplement chainée
    Par thecabbages dans le forum C
    Réponses: 3
    Dernier message: 17/12/2009, 21h08
  2. Suppression d'un element avec liste chainee
    Par gentil dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 04/10/2007, 13h50
  3. problème de pointeur avec les listes chainees
    Par innosang dans le forum C
    Réponses: 9
    Dernier message: 30/12/2005, 15h46
  4. Probleme avec les double Liste chainees
    Par BernardT dans le forum Langage
    Réponses: 1
    Dernier message: 12/07/2005, 17h22
  5. [LG]Listes chainées avec pointeur
    Par PaowZ dans le forum Langage
    Réponses: 2
    Dernier message: 17/02/2004, 19h49

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