Les structures
récursives (mise en œuvre de listes, …)
Un tableau constitue
un moyen efficace de stocker et d’accéder à l’information. Mais,
pour déclarer une variable de
typetableau, il faut
impérativement connaître la taille de ce tableau (le nombre
d’objets à ranger). Et de plus, cette taille ne peut pas changer
durant l’exécution.
Une liste linéaire est formée de cellules, chacune comportant une
valeur d’un certain type. Un pointeur de tête
pointe sur une première cellule (sauf si la liste est vide).
Cette cellule est soit suivie d’une deuxième cellule, soit elle
est la dernière.
De façon récursive, une liste est soit vide, soit est formée
d’une cellule suivie d’une liste.
Il est nécessaire de conserver à tout moment l’adresse de la
première cellule dans une variable que l’on
peut appeler tête et qui sera un pointeur sur une
cellule. Dans la dernière cellule, l’adresse du suivant sera mise
à NULL.
A chaque fois que l’on a besoin de rajouter une nouvelle cellule
à une liste, il suffit d’effectuer une allocation mémoire (par
l’intermédiaire de la fonctionmalloc) en lui
passant en paramètre la taille d’une cellule. Voici comment
aurait pu être créée la liste de la figure précédente :
L’exemple suivant demande à l’utilisateur d'entrer une suite de
nombres strictement positifs, suite terminée par 0 , et de ranger
ces nombres dans une liste en insérant à chaque fois la nouvelle
cellule en tête de liste (c'est une liste Dernier arrivé -
Premier servi (Last In First Out) :
struct cellule {
int valeur ;
struct cellule *suivant ;
};
/* créer une cellule dont la valeur est positionnée à l'aide du
nombre passé en paramère */