Académique Documents
Professionnel Documents
Culture Documents
I. Introduction
Jusqu'à maintenant, pour mémorise une liste des données qui concerne des étudiants ou des
employés, nous avons utilisé les tableaux. Ces derniers sont des structures statiques dont la taille, fixée
dès le début, ne varie pas. D'autre part, au niveau mémoire, si on déclare un tableau de 20 entiers, le
compilateur doit trouver une vingtaine de cases mémoires successives de taille un entier (les cases en
bleu dans la figure a).
-a- -b-
Les listes chainées sont des structures composées des cellules. Chaque cellule contient deux champs (ou
trois selon le type de la liste) le premier contient la variable et le deuxième un pointeur vers la cellule
qui suit. De cette façon, on peut enregistrer les cellules dans n'importe quelle case mémoire entier (les
cases en bleu dans la figure b). Néanmoins, il faut garder l'adresse de la tête de la liste, et puisque chaque
cellule a un lien vers son successeur (l'adresse de la cellule qui suit), on peut trouver tout le reste de la
liste. Avec les listes chainées, le compilateur n'est pas obligé de trouver des cases successives vides dans
la mémoire. Ces cases peuvent êtres éparpillés dans toute la mémoire ce qui constitue un gain
considérable.
En supposant que les éléments de la liste sont des entiers, celle-ci se déclare de la façon suivante :
En langage C
typedef struct cellule
{
int elem ;
struct cellule *suiv ;
} cellule ;
cellule *L ;
Remarques :
Il est très important lors de la création d’une liste chaînée, de penser à initialiser la tête de la liste à
null, sinon la liste n’aura jamais de fin et son parcours sera impossible.
Il faut noter qu’en langage C, le paramètre L dans l’entête de la procédure (qui contient la tête de la
liste à modifier) est précédé par deux symboles ‘*’ : *L pour indiquer qu’il s’agit d’un pointeur, et
**L pour indiquer que le paramètre *L est passé par adresse, ce qui est représenté par le mot clé
« Var » dans la version algorithmique. Ainsi, à l’intérieur de toute la procédure, il faut utiliser *L à
chaque fois où l’on veut mentionner ce paramètre.
En langage C p=L;
while (p !=NULL)
{
printf (p→elem) ;
p = p→suiv ;
}
}
Tête
a – Etat initial
Tête
E0 @c1
b- Etat final
Les deux fonctions suivantes récursive et itérative permettent de chercher un élément x dans la liste,
elles retournent vrai si x appartient à la liste et faux si on atteint la fin de la liste sans trouver la variable
x.
A. Version itérative
B. Version récursive
Tête
a – Etat initial
Tête