En langage C, les tableaux sont une première façon spontanée de représenter une liste. Les opérations d'insertion et de suppression d'éléments y sont toutefois malaisés. Elles nécessitent des redimensionnements du tableau et des recopies multiples. Nous allons voir une autre façon de représenter une liste, à l'aide de données dynamiques et de pointeurs : les listes chainées.
Les listes chainées
Une liste chainée est une structure dynamique formée de noeuds reliés par des liens. La figure ci dessous illustre ces concepts.
typedef struct Noeud
{
int donnée;
struct Noeud * suivant;
} Noeud;
Une liste peut ensuite être déclarée comme étant un simple lien (c'est à dire un pointeur) sur le premier noeud :
Noeud * liste;
Ce pointeur vaut NULL si la liste est vide et ne contient aucun élément. Il vaut l'adresse du premier noeud si la liste n'est pas vide. Les noeuds sont créés dynamiquement (avec la fonction malloc) au fur et à mesure des besoins. Ils sont détruits (avec la fonction free) s'ils ne sont plus utilisés. Il faut faire attention à bien renseigner la valeur du pointeur suivant
dans chaque noeud afin qu'il ait toujours soit la valeur NULL (fin de liste), soit l'adresse du noeud suivant.Ecrire un programme qui va utiliser des listes chaînées et offrir les fonctions suivantes pour les manipuler :
Noeud * cree_liste_vide();
void afficher(Noeud * liste);
Noeud * ajout_debut(Noeud * liste, int e);
Noeud * supprime_debut(Noeud * liste);
int taille(Noeud * liste);
int jieme(Noeud * liste, int j);
Noeud * ajout_jieme(Noeud * liste, int j, int e);
Noeud * supprime_jieme(Noeud * liste, int j);