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
l
i
Plus de 14 000 cours et tutoriels en informatique professionnelle c
i
t
consulter, tlcharger ou visionner en vido.

Accueil ALM Java .NET Dv. Web EDI Programmation SGBD Office Solutions d'entreprise Applications Mobiles Systmes

Accueil C Forums C FAQ C Tutoriels C Livres C Compilateurs et outils C Sources C Bibliothques C GTK+

ACCUEIL GTK+ FORUM GTK+ FAQ GTK+ TUTORIELS GTK+ SOURCES GTK+ BIBLIOTHEQUES LIVRES GTK+ OUTILS GTK+

Cours GTK 2

Table des matires

VIII. Les listes chanes


VIII-A. Les listes chanes
simples : GSList
VIII-A-1. Cration d'une
GSList
VIII-A-2. Rcuprer les
donnes d'une GSList
VIII-A-3. Suppression
d'lment d'un GSList
VIII-B. Les listes chanes
double : GList
VIII-B-1. Cration d'une
GList
VIII-B-2. Rcuprer les
donnes d'une GList
VIII-B-3. Suppression
d'lment d'un GSList
VIII-C. En savoir plus
VIII-C-1. Fonctions
documentes

VIII. Les listes chanes


Vous connaissez srement dj les listes chanes. Elles sont trs pratiques, mais il
faut s'occuper soit mme de la gestion de la mmoire, de chaner les lments,
chaque fois que l'on veut ajouter ou supprimer un lment. La bibliothque GLib
propose des listes chanes gnriques que nous allons pouvoir utiliser dans nos
applications Gtk+.

VIII-A. Les listes chanes simples : GSList

Regardons tout d'abord comment est dfini cet objet :

Slectionnez
struct GSList
{
gpointer data;
struct GSList *next;
};

Nous voyons donc qu'elle nous permet de crer la plus simple des liste chane, c'est
dire que chaque lment connat son suivant et rien d'autre. La liste s'organise
suivant ce schma :

tudions comment crer une telle liste.

VIII-A-1. Cration d'une GSList

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

Slectionnez
GSList *premier = NULL;

1 sur 6 05/08/2015 05:22


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

Ensuite, il n'existe pas de fonction spcifique pour crer la liste, il suffit juste
d'ajouter un lment la liste. Plusieurs fonctions sont disponibles mais nous allons
en tudier deux.

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

La premire g_slist_append ajoute un nouvel lment la fin de la liste, alors que


g_slist_prepend l'ajoute au dbut de la liste. La variable list est bien sr la liste
chane laquelle on veut ajouter un lment comportant la donne data. Il suffit de
faire un cast pour donner le type de data. Si l'on veut que notre premier lment soit
un widget, il suffira d'crire la ligne de code suivante :

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

La valeur de retour est trs importante : elle correspond l'adresse du premier


lment de la liste. En effet, au dpart notre lment premier ne pointe nulle part
(premier = NULL), il faut donc toujours rcuprer cette adresse (surtout dans le cas
de g_slist_prepend o le premier lment change).

VIII-A-2. Rcuprer les donnes d'une GSList

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

Slectionnez
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'lment recherch appartient, et n est la position
de l'lment dans la liste (le premier lment est n=0). Avec ces deux fonctions, il
suffit juste de connatre la position d'un lment pour rcuprer la donne qu'il
contient.

La premire fonction renvoie un pointeur sur une variable du type GSList. Il faudra
donc utiliser l'oprateur -> pour rcuprer la valeur data. La deuxime, par contre,
renvoie directement la valeur de data.

Si la valeur donne n ne fait pas partie de la liste, la valeur de retour sera NULL.

Supposons qu'une variable de type GtkWidget soit stocke dans le premier lment
d'une liste nomm liste, et que l'on veuille rcuprer ce widget, il faudra alors coder :

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

Ou

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

VIII-A-3. Suppression d'lment d'un GSList

Pour supprimer un lment dfinitivement d'une liste, la fonction utiliser est la


suivante :

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

Cette fonction cherche le premier lment de la liste contenant la donne data et le


supprime. La valeur de retour est l aussi trs importante car elle correspond
(toujours pareil) au nouveau premier lment de la liste. Si par hasard, plusieurs
lments contiennent la donne data, seul le premier sera supprim. Dans ce cas,
pour tous les supprimer, il faut utiliser cette fonction (dont l'utilisation est identique
la premire) :

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

Pour supprimer une liste entire, la fonction est :

Slectionnez

2 sur 6 05/08/2015 05:22


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 chanes double : GList

Cette liste est lgrement diffrente car en plus de connatre son suivant, chaque
lment connat aussi l'lment qui le prcde. Cette structure est dfinie ainsi :

Slectionnez
struct GList
{
gpointer data;
struct GList *next;
struct GList *prev;
};

Cette nouvelle liste s'organise donc ainsi :

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. Cration d'une GList

L encore, il nous faut un pointeur sur le premier lment de la liste.

Slectionnez
GList *premier = NULL;

Comme pour les GList, il n'y a pas de fonction spcifique il suffit d'ajouter des
lments avec les fonctions suivantes :

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

Les paramtres sont identiques que pour son homologue GSList et la valeur de retour
est toujours un pointeur sur le premier lment de la liste.

VIII-B-2. Rcuprer les donnes d'une GList

Une nouvelle fois, les fonctions ressemblent celles des GSList :

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

VIII-B-3. Suppression d'lment d'un GSList

Les fonctions de suppression sont toujours semblables :

Slectionnez
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,
dplacer, ordonner, supprimer des lments. Ces dernires 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'intrt particulier de ces deux types de listes dans les chapitres suivants.

VIII-C. En savoir plus

VIII-C-1. Fonctions documentes

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

3 sur 6 05/08/2015 05:22


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 lment dans une liste la position demande.

Entre(s) :

list : la liste.
data : la valeur ajouter.
position : la position laquelle sera ajout l'lment. Si cette valeur est
invalide (ngative ou trop grande) l'lment sera ajout la fin de la liste.

Sortie : le pointeur sur le premier lment de la liste.

Slectionnez
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 lment avant un autre lment.

Entre(s) :

list : la liste.
sibling : lment avant lequel doit tre insre notre nouvelle valeur.
data : valeur ajouter.

Sortie : le pointeur sur le premier lment de la liste.

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

Supprime un lment d'une liste. L'lment supprimer deviendra le premier d'un


nouvelle liste.

Entre(s) :

list : la liste.
link : l'lment supprimer de la liste.

Sortie : le pointeur sur le premier lment de la liste.

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

Supprime un lment d'un liste.

Entre(s) :

list : la liste.
link : l'lment supprimer.

Sortie :le pointeur sur le premier lment de la liste.

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

Pour connatre le nombre d'lment d'un liste.

Entre(s) :

list : la liste.

Sortie : le nombre d'lments de la liste.

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

Cre une copie d'une liste.

Entre(s) :

list : la liste.

Sortie : le pointeur sur le premier lment de la nouvelle liste.

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

4 sur 6 05/08/2015 05:22


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

Inverse les lments d'une liste

Entre(s) :

list : la liste.

Sortie : le pointeur sur le premier lment de la liste.

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

Ajoute une liste la fin d'une autre.

Entre(s) :

list1 : la liste de dpart.


list2 : liste ajouter la suite de list1.

Sortie : le pointeur sur le premier lment de la liste.

Slectionnez
GList* g_list_first(GList *list);

Pour rcuprer le premier lment d'une liste.

Entre(s) :

list : la liste.

Sortie : le pointeur sur le premier lment de la liste.

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

Pour rcuprer le dernier lment d'une liste.

Entre(s) :

list : la liste.

Sortie : le pointeur sur le dernier lment de la liste.

Slectionnez
g_slist_next(list)
g_list_next(list)

Une macro permettant d'obtenir l'lment suivant d'une liste.

Entre(s) :

list : la liste.

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

Slectionnez
g_list_previous(list)

Une macro permettant d'obtenir l'lment prcdent d'une liste.

Entre(s) :

list : la liste.

Sortie : un pointeur sur l'lment prcdent ou NULL si on est en dbut de liste.

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

Rcupre l'lment contenant une certaine donne.

Entre(s) :

list : la liste.
data : la donne chercher.

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

5 sur 6 05/08/2015 05:22


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

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

Pour connatre la position d'un lment.

Entre(s) :

list : la liste.
llink : l'lment chercher.

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

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

Pour connatre la position d'un lment contenant une certaine donne.

Entre(s) :

list : la liste.
data : la donne chercher.

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

Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre
convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge
par les droits d'auteur. Copyright 2013 developpez. Aucune reproduction, mme 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 intrts.

Responsable bnvole de la rubrique GTK+ : Francis Walter - Contacter par email

Nous contacter Participez Hbergement Informations lgales Partenaire : Hbergement Web


Copyright 2000-2015 - www.developpez.com

6 sur 6 05/08/2015 05:22