LLC Cours
LLC Cours
Nous allons essayer de voir ceci plus en détail sur ces schémas :
19 11 2 35
Tableau d'entiers
Nous avons sur ce schéma la représentation que l'on pourrait faire d'un tableau et d'une liste chaînée. Chacune
de ces représentations possède ses avantages et inconvénients. C'est lors de l'écriture de notre programme que
nous devons nous poser la question de savoir laquelle des deux méthodes est la plus intéressante.
Dans un tableau, la taille est connue, l'adresse du premier élément aussi. Lorsqu'on déclare un tableau, la
variable contiendra l'adresse du premier élément de notre tableau. Comme le stockage est contigu, et la
taille de chacun des éléments est connue, il est possible d'atteindre directement la case i d'un tableau.
Pour déclarer un tableau, il faut connaître sa taille.
Pour supprimer ou ajouter un élément à un tableau, il faut créer un nouveau tableau et supprimer
l'ancien
Dans une liste chaînée, la taille est inconnue au départ, la liste peut avoir autant d'éléments que la
mémoire le permet. Il est en revanche impossible d'accéder directement à l'élément i de la liste chainée.
Pour ce faire, il nous faudra parcourir les i-1 éléments précédents de la liste.
Pour déclarer une liste chaînée, il suffit de créer le pointeur qui va pointer sur le premier élément de
notre liste chaînée, aucune taille n'est donc à spécifier.
S. Boumediene Page 1
Ecole Supérieure des Sciences Appliquées d'Alger 2019/2020
Cours Informatique 2 : Listes chainées 1ère année
Il est possible d'ajouter, de supprimer, d'intervertir des éléments d'une liste chaînée sans avoir à recréer
la liste en entier, mais en manipulant simplement leurs pointeurs.
Voilà deux schémas pour expliquer comment se passent l'ajout et la suppression d'un élément d'une liste chaînée.
Remarquez le symbole en bout de chaîne qui signifie que l'adresse de l'élément suivant ne pointe sur rien, c'est-à-
dire sur NULL.
7 svt
#include <stdlib.h>
typedef struct element element;
struct element
{
int val;
struct element *suiv;
};
S. Boumediene Page 2
Ecole Supérieure des Sciences Appliquées d'Alger 2019/2020
Cours Informatique 2 : Listes chainées 1ère année
Code : C
#include <stdlib.h>
return 0;
}
Il est important de toujours initialiser la liste chaînée à NULL. Le cas échéant, elle sera considérée comme
contenant au moins un élément. C'est une erreur fréquente. De manière générale, il est plus sage de toujours
initialiser nos pointeurs.
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.
S. Boumediene Page 3
Ecole Supérieure des Sciences Appliquées d'Alger 2019/2020
Cours Informatique 2 : Listes chainées 1ère année
Code :
C'est l'ajout le plus simple des deux. Il suffit de créer un nouvel élément puis de le relier au début de la liste
originale. Si l'originale est, (vide) c'est NULL qui sera assigné au champ suiv du nouvel element. La liste contiendra
dans ce cas-là un seul élément.
7 svt
Code : C
S. Boumediene Page 4
Ecole Supérieure des Sciences Appliquées d'Alger 2019/2020
Cours Informatique 2 : Listes chainées 1ère année
lch ajouterEnFin(lch liste, int valeur)
{
/* On crée un nouvel élément */
element* nouvelElement = malloc(sizeof(element));
if(liste == NULL)
{
/* Si la liste est videé il suffit de renvoyer l'élément créé */
return nouvelElement;
}
else
{
/* Sinon, on parcourt la liste à l'aide d'un pointeur temporaire et on
indique que le dernier élément de la liste est relié au nouvel élément */
element* temp=liste;
while(temp->suiv != NULL)
{
temp = temp->suiv;
}
temp->suiv = nouvelElement;
return liste;
}
}
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->suiv != NULL), on avance d'un cran (temp = temp->suiv) 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.
S. Boumediene Page 5
Ecole Supérieure des Sciences Appliquées d'Alger 2019/2020
Cours Informatique 2 : Listes chainées 1ère année
En utilisant la récursivité :
lch effacerListe(lch liste)
{
if(liste == NULL) /* Si la liste est vide, il n'y a rien à effacer, on retourne
une liste vide i.e. NULL */
{
return NULL;
}
Else /* Sinon, on efface le premier élément et on retourne le reste de la liste
{ element *tmp; à effacée */
tmp = liste->suiv;
free(liste);
return effacerListe(tmp);
}
}
int main(int argc, char **argv)
{
lch ma_liste = NULL;
int i;
for(i=1;i<=10;i++)
{
ma_liste = ajouterEnTete(ma_liste, i);
ma_liste = ajouterEnFin(ma_liste, i);
}
afficherListe(ma_liste);
effacerListe(ma_liste);
return 0;
}
S. Boumediene Page 6