Vous êtes sur la page 1sur 6

Cours GTK 2

http://gtk.developpez.com/cours/gtk2/?page=page_8

Forums Tutoriels Magazine FAQs Blogs Chat Newsletter Études Emploi Club Contacts p u Developpez.com b
Forums Tutoriels
Magazine FAQs Blogs
Chat Newsletter
Études Emploi
Club
Contacts
p
u
Developpez.com
b
l
i
Plus de 14 000 cours et tutoriels en informatique professionnelle
à consulter, à télécharger ou à visionner en vidéo.
c
i
t
é
Accueil
ALM
Java
.NET
Dév. Web
EDI
Programmation
SGBD
Office
Solutions d'entreprise
Applications
Mobiles
Systèmes
Accueil C
Forums C
FAQ C
Tutoriels C
Livres C
Compilateurs et outils C
Sources C
Bibliothèques C
GTK+
ACCUEIL GTK+
FORUM GTK+
FAQ GTK+
TUTORIELS GTK+
SOURCES GTK+
BIBLIOTHEQUES
LIVRES GTK+
OUTILS GTK+

Cours GTK 2

Table des matières VIII. Les listes chaînées VIII-A. Les listes chaînées simples : GSList VIII-A-1.
Table des matières
VIII. Les listes chaînées
VIII-A. Les listes chaînées
simples : GSList
VIII-A-1. Création d'une
GSList
VIII-A-2. Récupérer les

VIII-A-2. Récupérer les

VIII-A-2. Récupérer les

données d'une GSList VIII-A-3. Suppression d'élément d'un GSList

VIII-B. Les listes chaînées double : GList VIII-B-1. Création d'une GList VIII-B-2. Récupérer les données d'une GList

VIII-B-3. Suppression d'élément d'un GSList VIII-C. En savoir plus VIII-C-1. Fonctions documentées

VIII-C. En savoir plus VIII-C-1. Fonctions documentées VIII. Les listes chaînées ▲ Vous connaissez sûrement
VIII-C. En savoir plus VIII-C-1. Fonctions documentées VIII. Les listes chaînées ▲ Vous connaissez sûrement
VIII-C. En savoir plus VIII-C-1. Fonctions documentées VIII. Les listes chaînées ▲ Vous connaissez sûrement
VIII-C. En savoir plus VIII-C-1. Fonctions documentées VIII. Les listes chaînées ▲ Vous connaissez sûrement

VIII. Les listes chaînées

Vous connaissez sûrement déjà les listes chaînées. Elles sont très pratiques, mais il faut s'occuper soit même de la gestion de la mémoire, de chaîner les éléments, à chaque fois que l'on veut ajouter ou supprimer un élément. La bibliothèque GLib propose des listes chaînées génériques que nous allons pouvoir utiliser dans nos applications Gtk+.

VIII-A. Les listes chaînées simples : GSList

Regardons tout d'abord comment est défini cet objet :

Sélectionnez

struct GSList

{

gpointer data; struct GSList *next;

};

Nous voyons donc qu'elle nous permet de créer la plus simple des liste chaînée, c'est à dire que chaque élément connaît son suivant et rien d'autre. La liste s'organise suivant ce schéma :

d'autre. La liste s'organise suivant ce schéma : Étudions comment créer une telle liste. VIII-A-1.

Étudions comment créer une telle liste.

VIII-A-1. Création d'une GSList

Il faut d'abord avoir le pointeur sur le premier élément de la liste. Pour cela, rien de plus simple :

Sélectionnez

GSList *premier = NULL;

Cours GTK 2

http://gtk.developpez.com/cours/gtk2/?page=page_8

Ensuite, il n'existe pas de fonction spécifique pour créer la liste, il suffit juste d'ajouter un élément à la liste. Plusieurs fonctions sont disponibles mais nous allons en étudier deux.

Sélectionnez

GSList* g_slist_append(GSList *list, gpointer data); GSList* g_slist_prepend(GSList *list, gpointer data);

La première g_slist_append ajoute un nouvel élément à la fin de la liste, alors que g_slist_prepend l'ajoute au début de la liste. La variable list est bien sûr la liste chaînée à laquelle on veut ajouter un élément comportant la donnée data. Il suffit de faire un cast pour donner le type de data. Si l'on veut que notre premier élément soit un widget, il suffira d'écrire la ligne de code suivante :

Sélectionnez

premier = g_slist_append(premier,(GtkWidget*) widget);

La valeur de retour est très importante : elle correspond à l'adresse du premier élément de la liste. En effet, au départ notre élément premier ne pointe nulle part (premier = NULL), il faut donc toujours récupérer cette adresse (surtout dans le cas de g_slist_prepend où le premier élément change).

VIII-A-2. Récupérer les données d'une GSList

Là aussi, nous n'allons étudier que deux fonctions :

Sélectionnez

GSList* g_slist_nth(GSList *list, guint n); gpointer g_slist_nth_data(GSList *list, guint n);

List est bien sur la liste à laquelle l'élément recherché appartient, et n est la position de l'élément dans la liste (le premier élément est à n=0). Avec ces deux fonctions, il suffit juste de connaître la position d'un élément pour récupérer la donnée qu'il contient.

La première fonction renvoie un pointeur sur une variable du type GSList. Il faudra donc utiliser l'opérateur -> pour récupérer la valeur data. La deuxième, par contre, renvoie directement la valeur de data.

Si la valeur donnée à n ne fait pas partie de la liste, la valeur de retour sera NULL.

Supposons qu'une variable de type GtkWidget soit stockée dans le premier élément d'une liste nommé liste, et que l'on veuille récupérer ce widget, il faudra alors coder :

Sélectionnez

temp_list = g_slist_nth(liste, 0); widget = (GtkWidget*) (temp_list->data);

Ou

Sélectionnez

widget = (GtkWidget*) g_slist_nth_data(liste, 0);

VIII-A-3. Suppression d'élément d'un GSList

Pour supprimer un élément définitivement d'une liste, la fonction à utiliser est la suivante :

Sélectionnez

GSList* g_slist_remove(GSList *list, gconstpointer data);

Cette fonction cherche le premier élément de la liste contenant la donnée data et le supprime. La valeur de retour est là aussi très importante car elle correspond (toujours pareil) au nouveau premier élément de la liste. Si par hasard, plusieurs éléments contiennent la donnée data, seul le premier sera supprimé. Dans ce cas, pour tous les supprimer, il faut utiliser cette fonction (dont l'utilisation est identique à la première) :

Sélectionnez

GSList* g_slist_remove_all(GSList *list, gconstpointer data);

Pour supprimer une liste entière, la fonction est :

Sélectionnez

Cours GTK 2

http://gtk.developpez.com/cours/gtk2/?page=page_8

void g_slist_free(GSList *list);

Avec toutes ces fonctions, nous en savons suffisamment pour pouvoir utiliser une liste simple.

VIII-B. Les listes chaînées double : GList

Cette liste est légèrement différente car en plus de connaître son suivant, chaque élément connaît aussi l'élément qui le précède. Cette structure est définie ainsi :

Sélectionnez

struct GList

{

gpointer data; struct GList *next; struct GList *prev;

};

Cette nouvelle liste s'organise donc ainsi :

}; Cette nouvelle liste s'organise donc ainsi : L'étude sera cette fois beaucoup plus rapide car

L'étude sera cette fois beaucoup plus rapide car vous allez le voir, les fonctions pour les GList sont quasiment identiques à celles de GSList.

VIII-B-1. Création d'une GList

Là encore, il nous faut un pointeur sur le premier élément de la liste.

Sélectionnez

GList *premier = NULL;

Comme pour les GList, il n'y a pas de fonction spécifique il suffit d'ajouter des éléments avec les fonctions suivantes :

Sélectionnez

GList* g_list_append(GList *list, gpointer data); GList* g_list_prepend(GList *list, gpointer data);

Les paramètres sont identiques que pour son homologue GSList et la valeur de retour est toujours un pointeur sur le premier élément de la liste.

VIII-B-2. Récupérer les données d'une GList

Une nouvelle fois, les fonctions ressemblent à celles des GSList :

Sélectionnez

GList* g_list_nth(GList *list, guint n); gpointer g_list_nth_data(Glist *list, guint n);

VIII-B-3. Suppression d'élément d'un GSList

Les fonctions de suppression sont toujours semblables :

Sélectionnez

GList* g_list_remove(GList *list, gconstpointer data); GList* g_list_remove_all(GList *list, gconstpointer data); void g_list_free(GList *list);

Bien sur pour ces deux types de listes, d'autres fonctions existent pour ajouter, déplacer, ordonner, supprimer des éléments. Ces dernières sont (comme à l'accoutumé) dans la section en savoir plus.

Il n'y aura pas dans ce chapitre d'exemple d'utilisation, mais vous pourrez voir l'intérêt particulier de ces deux types de listes dans les chapitres suivants.

VIII-C. En savoir plus

VIII-C-1. Fonctions documentées

Sélectionnez

GSList* g_slist_insert(GSList *list, gpointer data, gint position);

Cours GTK 2

http://gtk.developpez.com/cours/gtk2/?page=page_8

GList* g_list_insert(GList *list, gpointer data, gint position);

Ajoute un nouvel élément dans une liste à la position demandée.

Entrée(s) :

list : la liste.dans une liste à la position demandée. Entrée(s) : data : la valeur à ajouter. position

data : la valeur à ajouter.à la position demandée. Entrée(s) : list : la liste. position : la position à laquelle

position : la position à laquelle sera ajouté l'élément. Si cette valeur est invalide (négative ou trop grande) l'élément sera ajouté à la fin de la liste.Entrée(s) : list : la liste. data : la valeur à ajouter. Sortie : le pointeur

Sortie : le pointeur sur le premier élément de la liste.

Sélectionnez

GSList* g_slist_insert_before(GSList *list, GSList *sibling, gpointer data); GList* g_list_insert_before(GList *list, GList *sibling, gpointer data);

Ajoute un nouvel élément avant un autre élément.

Entrée(s) :

list : la liste.un nouvel élément avant un autre élément. Entrée(s) : sibling : élément avant lequel doit être

sibling : élément avant lequel doit être insérée notre nouvelle valeur.avant un autre élément. Entrée(s) : list : la liste. data : valeur à ajouter. Sortie

data : valeur à ajouter.avant lequel doit être insérée notre nouvelle valeur. Sortie : le pointeur sur le premier élément

Sortie : le pointeur sur le premier élément de la liste.

Sélectionnez

GSList* g_slist_remove_link(GSList *list, GSList *link); GList* g_list_remove_link(GList *list, GList *link);

Supprime un élément d'une liste. L'élément supprimer deviendra le premier d'un nouvelle liste.

Entrée(s) :

list : la liste.deviendra le premier d'un nouvelle liste. Entrée(s) : link : l'élément à supprimer de la liste.

link : l'élément à supprimer de la liste.d'un nouvelle liste. Entrée(s) : list : la liste. Sortie : le pointeur sur le premier

Sortie : le pointeur sur le premier élément de la liste.

Sélectionnez

GSList* g_slist_delete_link(GSList *list, GSList *link); GList* g_list_delete_link(GList *list, GList *link);

Supprime un élément d'un liste.

Entrée(s) :

list : la liste.*link); Supprime un élément d'un liste. Entrée(s) : link : l'élément à supprimer. Sortie :le pointeur

link : l'élément à supprimer.un élément d'un liste. Entrée(s) : list : la liste. Sortie :le pointeur sur le premier

Sortie :le pointeur sur le premier élément de la liste.

Sélectionnez

guint g_slist_length(GSList *list); guint g_list_length(GList *list);

Pour connaître le nombre d'élément d'un liste.

Entrée(s) :

list : la liste.le nombre d'élément d'un liste. Entrée(s) : Sortie : le nombre d'éléments de la liste.

Sortie : le nombre d'éléments de la liste.

Sélectionnez

GSList* g_slist_copy(GSList *list); GList* g_list_copy(GList *list);

Crée une copie d'une liste.

Entrée(s) :

list : la liste.*list); Crée une copie d'une liste. Entrée(s) : Sortie : le pointeur sur le premier élément

Sortie : le pointeur sur le premier élément de la nouvelle liste.

Sélectionnez

GSList* g_slist_reverse(GSList *list); GList* g_list_reverse(GList *list);

Cours GTK 2

http://gtk.developpez.com/cours/gtk2/?page=page_8

Inverse les éléments d'une liste

Entrée(s) :

list : la liste.Inverse les éléments d'une liste Entrée(s) : Sortie : le pointeur sur le premier élément de

Sortie : le pointeur sur le premier élément de la liste.

Sélectionnez

GSList* g_slist_concat(GSList *list1, GSList *list2); GList* g_list_concat(GList *list1, GList *list2);

Ajoute une liste à la fin d'une autre.

Entrée(s) :

list1 : la liste de départ.Ajoute une liste à la fin d'une autre. Entrée(s) : list2 : liste à ajouter à

list2 : liste à ajouter à la suite de list1.d'une autre. Entrée(s) : list1 : la liste de départ. Sortie : le pointeur sur le

Sortie : le pointeur sur le premier élément de la liste.

Sélectionnez

GList* g_list_first(GList *list);

Pour récupérer le premier élément d'une liste.

Entrée(s) :

list : la liste.le premier élément d'une liste. Entrée(s) : Sortie : le pointeur sur le premier élément de

Sortie : le pointeur sur le premier élément de la liste.

Sélectionnez

GSList* g_slist_last(GSList *list); GList* g_list_last(GList *list);

Pour récupérer le dernier élément d'une liste.

Entrée(s) :

list : la liste.le dernier élément d'une liste. Entrée(s) : Sortie : le pointeur sur le dernier élément de

Sortie : le pointeur sur le dernier élément de la liste.

Sélectionnez

g_slist_next(list)

g_list_next(list)

Une macro permettant d'obtenir l'élément suivant d'une liste.

Entrée(s) :

list : la liste.l'élément suivant d'une liste. Entrée(s) : Sortie : le pointeur sur l'élément suivant ou NULL si

Sortie : le pointeur sur l'élément suivant ou NULL si l'on est en fin de liste.

Sélectionnez

g_list_previous(list)

Une macro permettant d'obtenir l'élément précédent d'une liste.

Entrée(s) :

list : la liste.l'élément précédent d'une liste. Entrée(s) : Sortie : un pointeur sur l'élément précédent ou

Sortie : un pointeur sur l'élément précédent ou NULL si on est en début de liste.

Sélectionnez

GSList* g_slist_find(GSList *list, gconstpointer data); GList* g_list_find(GList *list, gconstpointer data);

Récupère l'élément contenant une certaine donnée.

Entrée(s) :

list : la liste.contenant une certaine donnée. Entrée(s) : data : la donnée à chercher. Sortie : un pointeur

data : la donnée à chercher.une certaine donnée. Entrée(s) : list : la liste. Sortie : un pointeur sur l'élément trouvé

Sortie : un pointeur sur l'élément trouvé ou NULL s'il n'y en a pas.

Cours GTK 2

http://gtk.developpez.com/cours/gtk2/?page=page_8

Sélectionnez

gint g_slist_position(GSList *list, GSList *llink); gint g_list_position(GList *list, GList *llink);

Pour connaître la position d'un élément.

Entrée(s) :

list : la liste.connaître la position d'un élément. Entrée(s) : llink : l'élément à chercher. Sortie : la position

llink : l'élément à chercher.position d'un élément. Entrée(s) : list : la liste. Sortie : la position de l'élément dans

Sortie : la position de l'élément dans la liste ou -1 s'il n'existe pas.

Sélectionnez

gint g_slist_index(GSList *list, gconstpointer data); gint g_list_index(GList *list, gconstpointer data);

Pour connaître la position d'un élément contenant une certaine donnée.

Entrée(s) :

list : la liste.élément contenant une certaine donnée. Entrée(s) : data : la donnée à chercher. Sortie : la

data : la donnée à chercher.une certaine donnée. Entrée(s) : list : la liste. Sortie : la position de l'élément dans

Sortie : la position de l'élément dans la liste ou -1 s'il n'existe pas.

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 developpez. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Responsable bénévole de la rubrique GTK+ : Francis Walter - Contacter par email

Nous contacter

Participez

Hébergement

Informations légales

Partenaire : Hébergement Web

Copyright © 2000-2015 - www.developpez.com