GERBELOTBARILLON.COM

Parce qu'il faut toujours un commencement...

Listes chaînées en C

Introduction


Les listes chaînées sont très utiles pour la représentation d’éléments disposant de quantités variables. Leur conception permet de modéliser de nombreuses situations impliquant une gestion ordonnée de l’information. Ainsi, les piles, les files, les arbres sont des candidats idéaux à l’utilisation de listes chaînées. Elles pourront être « simplement chaînées » ou « doublement chaînées » pour permettre un parcours en sens unique ou bien dans les deux sens.

En pratique, une liste chaînée repose sur l’usage des structures du langage C, chaque structure disposant du moyen d’atteindre au minimum son successeur (liste simplement chaînée), au mieux son prédécesseur et son successeur (liste doublement chaînée). Ce chaînage est réalisé au moyen de pointeurs, éléments essentiels à connaître pour une bonne pratique du langage c.

Un pointeur est une variable représentant l’emplacement mémoire d’une autre variable. Au lieu de contenir une valeur directement exploitable, le pointeur référence un autre emplacement qui, lui, va contenir notre information. Grâce à un pointeur nous créons une indirection dans l’accès aux données. C’est une notion extrêmement importante et elle prendra tout son sens dans les lignes qui vont suivre.

Les structures de pile


Une pile est une structure qui consiste à traiter les éléments dans le sens (dernier entré, premier sorti). Dans la littérature, cela s’appelle LIFO (Last In, First Out). Imaginez-vous simplement une pile d’assiettes. Si vous aviez besoin de prendre une assiette, enlèveriez-vous celle se trouvant tout en bas de la pile ? Non... La première au-dessus de la pile vous conviendrait parfaitement... En informatique, la notion de pile est exactement la même : on empile les éléments d’un côté et les dépile du même, d’où le terme LIFO.

Le haut de la pile est repéré par un pointeur. Chaque nouvelle valeur vient s’intercaler entre le pointeur de haut de pile et le premier véritable élément de la pile. Le schéma ci-contre détaille l’aspect que prend une structure empilée complète.

Les opérations possibles avec une pile sont les suivantes :

  • Initialisation de l’entête de la pile : consiste à déclarer un pointeur du type des éléments à empiler qui indiquera l’adresse du premier élément de la pile.
  • Empilage d’un élément : insertion d’un élément en haut de la pile
  • Dépilage d’un élément : retrait de l’élément le plus en haut de la pile
  • Affichage des éléments de la pile : parcours des éléments depuis le haut de la pile vers le dernier
  • RAZ de la pile : suppression de tous les éléments de la pile et libération de la mémoire occupée

Pour l’implémentation informatique de l’algorithme relatif à la gestion d’une pile, une structure à base de tableau pourrait être mise en place, plus simple que les listes chaînées, mais également plus restrictive car il est beaucoup plus compliqué de modifier le nombre d'éléments d'un tableau que d'une liste dynamique.

pile