Vous êtes sur la page 1sur 7

Atelier de programmation structurée Enseignante 

: MmeMalika ELMONSER

Atelier 4 : Les listes chaînées

OBJECTIFS
Connaître la notion de liste simplement chainée en C.
Connaître les différentes opérations sur les listes chainées.

1. Définition

Une liste est un ensemble d’objets de même type constituant les éléments de la liste. Les
éléments sont chaînés entre eux et on peut facilement ajouter ou extraire un ou plusieurs
éléments.

Une liste est une structure de données telle que chaque élément contient:

 des informations sur l’objet


 un pointeur sur un autre élément de la liste, ou un pointeur NULL s’il n’y a pas
d’élément suivant.
2. Représentation en mémoire d’une liste

Voici en exemple la représentation en mémoire de la liste des patients selon leur ordre
d’arrivée dans une salle d’attente chez le médecin.

En allocation dynamique, les emplacements mémoires sont dispersés en mémoire


centrale. L’espace est réservé au fur et à mesure des créations des éléments de la liste. La
seule limite étant la taille de la mémoire centrale.

Il existe différents type de listes chainées:

 Les listes simplement chainées.

 Les listes doublement chainées

1
Atelier de programmation structurée Enseignante : MmeMalika ELMONSER

 Les piles

 Les files

3. Exemple complet d’une listesimplement chainée


a. Déclaration en C d'une liste chainée

On crée le type element qui est une structure contenant un entier (val) et un pointeur sur
élément (nxt), qui contiendra l'adresse de l'élément suivant.Ensuite, il nous faut créer le type
llist (pour linkedlist = liste chaînée) qui est en fait un pointeur sur le type element. Lorsque
nous allons déclarer la liste chaînée, nous devrons déclarer un pointeur sur element,
l'initialiser à NULL, pour pouvoir ensuite allouer le premier élément. N'oubliez pas d'inclure
stdlib.h afin de pouvoir utiliser la macro NULL. Comme vous allez le constater, nous avons
juste crée le type llist afin de simplifier la déclaration.

Voilà comment déclarer une liste chaînée (vide pour l'instant) :

2
Atelier de programmation structurée Enseignante : MmeMalika ELMONSER

b. Manipuler les listes chainées


 Ajouter un élément

Lorsque nous voulons ajouter un élément dans une liste chaînée, il faut savoir où l'insérer. Les
deux ajouts génériques des listes chaînées sont les ajouts en tête, et les ajouts en fin de liste.
Nous allons étudier ces deux moyens d'ajouter un élément à une liste.
 Ajouter en tête

Lors d'un ajout en tête, nous allons créer un élément, lui assigner la valeur que l'on veut
ajouter, puis pour terminer, raccorder cet élément à la liste passée en paramètre. Lors d'un
ajout en tête, on devra donc assigner à nxt l'adresse du premier élément de la liste passé en
paramètre. Visualisons tout ceci sur un schéma :

3
Atelier de programmation structurée Enseignante : MmeMalika ELMONSER

Ajouter en fin de liste


Cette fois-ci, c'est un peu plus compliqué. Il nous faut tout d'abord créer un nouvel élément,
lui assigner sa valeur, et mettre l'adresse de l'élément suivant à NULL. En effet, comme cet
élément va terminer la liste nous devons signaler qu'il n'y a plus d'élément suivant. Ensuite, il
faut faire pointer le dernier élément de liste originale sur le nouvel élément que nous venons
de créer. Pour ce faire, il faut créer un pointeur temporaire sur element qui va se déplacer
d'élément en élément, et regarder si cet élément est le dernier de la liste. Un élément sera
forcément le dernier de la liste si NULL est assigné à son champ nxt.

4
Atelier de programmation structurée Enseignante : MmeMalika ELMONSER

Comme vous pouvez le constater, nous nous déplaçons le long de la liste chaînée grâce au pointeur temp.
Si l'élément pointé par temp n'est pas le dernier (temp->nxt != NULL), on avance d'un cran (temp = temp-
>nxt) en assignant à temp l'adresse de l'élément suivant. Une fois que l'on est au dernier élément, il ne reste
plus qu'à le relier au nouvel élément.

Si vous pensez avoir bien saisi ces deux fonctions, je vous invite à passer à la partie suivante, dans laquelle
je vais vous proposer quelques exercices. Le premier sera fondamental puisqu'il nous permettra d'afficher le
contenu d'une liste chaînée.

Exercice 1
Coder la fonction afficherListe permettant d’afficher la liste des éléments.Vous devrez
parcourir la liste jusqu'au bout et afficher toutes les valeurs qu'elle contient.

Exercice 2
1. Coder les trois fonctions suivantes :
 ajouterEnTete
 ajouterEnFin
 afficherListe

2. Ecrire la fonction main permettant de remplir et afficher la liste chaînée L.


5
Atelier de programmation structurée Enseignante : MmeMalika ELMONSER

Exercice 3
Écrire une fonction qui renvoie 1 si la liste est vide, et 0 si elle contient au moins un élément.
 Supprimer un élément

Supprimer un élément en tête


Il s'agit là de supprimer le premier élément de la liste. Pour ce faire, il nous faudra utiliser la
fonction free. Si la liste n'est pas vide, on stocke l'adresse du premier élément de la liste après
suppression (i.e. l'adresse du 2ème élément de la liste originale), on supprime le premier
élément, et on renvoie la nouvelle liste. Attention quand même à ne pas libérer le premier
élément avant d'avoir stocké l'adresse du second, sans quoi il sera impossible de la récupérer.

Supprimer un élément en fin de liste


Cette fois-ci, il va falloir parcourir la
liste jusqu'à son dernier élément,
indiquer que l'avant-dernier élément
va devenir le dernier de la liste et
libérer le dernier élément pour enfin
retourner le pointeur sur le premier
élément de la liste d'origine.

Exercice 4

6
Atelier de programmation structurée Enseignante : MmeMalika ELMONSER

Ecrire la fonction rechercheElement permettant de rechercher un élément et de renvoyer


l'adresse du premier élément trouvé ayant une certaine valeur. Si aucun élément n'est trouvé,
on renverra NULL.

Exercice 5
Ecrire la fonction nombreOccurences permettant de retourner le nombre d’occurrence d’un
élément donnée en paramètre.
Utiliser la fonction précédente permettant de rechercher un élément.

Exercice 6
Ecrire la fonction nombreElements permettant de retourner le nombre d’élément de la liste.
Utiliser une méthode itérative et récursive.

Exercice 7
Ecrire une fonction permettant d'effacer complètement une liste chaînée de la mémoire.
Utiliser de 2 méthodes itératives et récursives. Dans le premier cas, vous devez parcourir la
liste, stocker l'élément suivant, effacer l'élément courant et avancer d'une case. A la fin la liste
est vide, nous retournerons NULL.

Vous aimerez peut-être aussi