Vous êtes sur la page 1sur 44

Chapitre 2: Les listes chainées

28
Chapitre 2: Les listes chainées

QU’EST-CE QU’UNE LISTE CHAÎNÉE ?

Cellules

29
Chapitre 2: Les listes chainées

QU’EST-CE QU’UNE LISTE CHAÎNÉE ?

tête 100 data 101 data 102 data 103 data NULL
100 101 102 103

30
Chapitre 2: Les listes chainées

QU’EST-CE QU’UNE LISTE CHAÎNÉE ?

 Une liste chaînée est un ensemble de cellules (éléments, nœuds) liées entre elles par
des pointeurs. Chaque cellule est une structure contenant les champs suivants :

 Une ou plusieurs données comme dans n’importe quelle structure ;

 Un pointeur "suivant" contient l’adresse mémoire de la cellule suivante.

tête 100 data 101 data 102 data 103 data NULL
100 101 102 103

Exemple de liste chaînée avec 4 cellules


 L’entête d’une liste chainée contient toujours l’adresse de la première cellule.
31
Chapitre 2: Les listes chainées

 Exemple: cellule client

On va créer une liste chainée qui regroupe un ensemble de Cellule client


cellules, et chaque cellule "cellule client" sera composée
de:
client
 Partie données: nom et téléphone de client
 Pointeur: pointe sur la cellule suivante. données

nom_clt tel_clt adresse de la


cellule
suivante

32
Chapitre 2: Les listes chainées – Opérations sur les listes chainées

1. Définition de la cellule client

struct client {
char nom_clt[20]; Cellule client
long tel_clt;

};
*next_clt;
client
données

nom_clt tel_clt adresse de la


cellule
suivante

33
Chapitre 2: Les listes chainées – Opérations sur les listes chainées

1. Définition de la cellule client

struct client {
char nom_clt[20]; Cellule client
long tel_clt;

};
struct client *next_clt;
client
données

nom_clt tel_clt adresse de la


cellule
suivante

34
Chapitre 2: Les listes chainées – Opérations sur les listes chainées

1. Définition de la cellule client Cellule client

struct client { client


char nom_clt[20];
long tel_clt; données
struct client *next_clt;
}; nom_clt tel_clt adresse de la
cellule
suivante
2. Déclaration de l’entête de la liste chainée.
address Stack address Heap
struct client *tete = NULL; 100 200
tete 32 octets
(4 oct) Création de
101 200 201
tete = malloc(sizeof(struct client)); la
102 202 1ére cellule
de la liste
103 203 chainée
35
Chapitre 2: Les listes chainées – Opérations sur les listes chainées

3. Création de la liste chainée (création de cellules)


tête cellule1
struct client {
NULL ? ? ?
char nom_clt[20];
long tel_clt;
struct client *next_clt; 200
};
struct client *tete = NULL;
nom_clt tel_clt adresse de la
tete = malloc(sizeof(struct client);
cellule
suivante

36
Chapitre 2: Les listes chainées – Opérations sur les listes chainées

3. Création de la liste chainée (création de cellules)


tête cellule1
struct client {
200 ? ? ?
char nom_clt[20];
long tel_clt;
struct client *next_clt;
200
};
struct client *tete = NULL;
nom_clt tel_clt adresse de la
tete = malloc(sizeof(struct client);
cellule
suivante

37
Chapitre 2: Les listes chainées – Opérations sur les listes chainées

3. Création de la liste chainée (création de cellules) tête 200 ? ? ? cellule1


struct client { 200
char nom_clt[20]; //Définition de la cellule
long tel_clt; cell2 232 ? ? ? cellule2
struct client *next_clt;
};
232
struct client *tete = NULL; // déclaration de l’entête
tete = malloc(sizeof(struct client); // creation de la 1ère cell3 264 cellule3
cellule client
? ? ?
struct client *cell2 = malloc(sizeof(struct client);
struct client * cell3 = malloc(sizeof(struct client); 264
struct client * cell4 = malloc(sizeof(struct client);
cell4 296 ? ? ? cellule4

296

38
Chapitre 2: Les listes chainées – Opérations sur les listes chainées

3. Création de la liste chainée (création de cellules) tete 200 ? ? ?


232 cellule1
struct client { 200
char nom_clt[20];
long tel_clt; cell2 232 ? ? 264
? cellule2
struct client *next_clt;
};
232
struct client *tete = NULL;
tete = malloc(sizeof(struct client); cell3 264 cellule3
? ? ?
296
struct client * cell2 = malloc(sizeof(struct client);
struct client * cell3 = malloc(sizeof(struct client);
264
struct client * cell4 = malloc(sizeof(struct client);
tete ->next_clt = cell2; Pour cell4 296 ? ? ?
NULL cellule4
cell2 ->next_clt = cell3; faire
lier les
cell3 ->next_clt = cell4;
cellules
cell4 ->next_clt = NULL; entre 296
elles
39
Chapitre 2: Les listes chainées – Opérations sur les listes chainées

3. Création de la liste chainée (création de cellules) tete 200 ? ? 232 cellule1


struct client { 200
char nom_clt[20];
long tel_clt; cell2 232 ? ? 264 cellule2
struct client *next_clt;
};
232
struct client *tete = NULL;
tete = malloc(sizeof(struct client); cell3 264 cellule3
? ? 296
struct client * cell2 = malloc(sizeof(struct client);
struct client * cell3 = malloc(sizeof(struct client);
264
struct client * cell4 = malloc(sizeof(struct client);
tete ->next_clt = cell2; Pour cell4 296 ? ? NULL cellule4
cell2 ->next_clt = cell3; faire
lier les
cell3 ->next_clt = cell4;
cellules
cell4 ->next_clt = NULL; entre 296
elles
40
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
3. Remplir les cellules
struct client {
char nom_clt[20];
long tel_clt;
struct client *next_clt;
};
struct client *tete = NULL;
tete = malloc(sizeof(struct client);
struct client * cell2 = malloc(sizeof(struct client);
struct client * cell3 = malloc(sizeof(struct client);
struct client * cell4 = malloc(sizeof(struct client);
tete ->next_clt = cell2;
cell2 ->next_clt = cell3;
cell3 ->next_clt = cell4;
cell4 ->next_clt = NULL;
struct client *ptr =tete;
while (ptr != NULL)

??
{
printf("Nom :\t");
scanf("%s",&ptr->nom_clt);
printf("Tel :\t");
scanf("%d",&ptr->tel_clt);
ptr = ptr->nextclt; 41
}
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
4. Parcourir une liste chainée (Affichage)

Exercice:
Ecrire une fonction qui permet d’afficher tous les clients (Nom + N° de téléphone) de la liste
chainée créée précédemment.

void affichageList(struct client *p)


{
while (p!= NULL) {
printf("\nNom du client: %s", p->nom_clt);
printf("\nTel du client: %d", p->tel_clt);
printf("\n-------------\n");
p=p->nextclt; }
}
int main()
{ ....
ptr=tete;
affichageList(ptr); } Appel de la fonction 42
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
Programme complet (création, liaison, remplissage, affichage)

43
Travail à faire
"Faire une
description
schématique"
44
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
5. L’ajout d’une cellule (client) au début de la liste chainée.

tete

202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

Othman 0667307027
Les étapes à suivre:
1. Création de la nouvelle cellule avec malloc().
2. Remplissage de la cellule par les données. 320
3. Faire la liaison entre le nouvelle cellule et la première cellule de la liste chainée.
4. Modification de la tête de la liste pour qu’elle pointe sur la nouvelle cellule.

45
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
5. L’ajout d’une cellule (client) au début de la liste chainée.

tete

202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

Othman 0667307027 202


Les étapes à suivre:
1. Création de la cellule avec malloc
2. Remplissage de la cellule par les données 320
3. Faire la liaison entre le nouvelle cellule et la première cellule de la liste chainée.
4. Modification de la tête de la liste pour qu’elle pointe sur la nouvelle cellule.

46
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
5. L’ajout d’une cellule (client) au début de la liste chainée.

tete

320
202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

Othman 0667307027 202

320

47
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
5. L’ajout d’une cellule (client) au début de la liste chainée.

Exercice:

En utilisant une fonction ajoutDebut(), écrire un programme qui permet d’ajouter des
nouveaux clients au début de la liste chainée.
(le nombre de client à ajouter est fixé par l’utilisateur).

48
49
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
6. L’ajout d’une cellule (client) à la fin de la liste chainée.
ptr
202 ptr = ptr -> nextclt

tete

202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

Othman 0667307027 NULL


Les étapes à suivre:

1. Création de la nouvelle cellule avec malloc(). 320


2. Remplissage de la cellule par les données + mettre la valeur NULL dans le champ next_clt
3. Parcourir la liste jusqu’à l’arrivé à l’adresse de la dernière cellule de la liste.

50
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
6. L’ajout d’une cellule (client) à la fin de la liste chainée.
ptr
202 ptr = ptr -> nextclt

tete

202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

Othman 0667307027 NULL


Les étapes à suivre:

1. Création de la cellule avec malloc 320


2. Remplissage de la cellule par les données + mettre la valeur NULL dans le champ next_clt
3. Parcourir la liste jusqu’à l’arrivé à l’adresse de la dernière cellule de la liste.

51
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
6. L’ajout d’une cellule (client) à la fin de la liste chainée.
ptr
203 ptr = ptr -> nextclt

tete

202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

Othman 0667307027 NULL


Les étapes à suivre:

1. Création de la cellule avec malloc 320


2. Remplissage de la cellule par les données + mettre la valeur NULL dans le champ next_clt
3. Parcourir la liste jusqu’à l’arrivé à l’adresse de la dernière cellule de la liste.

52
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
6. L’ajout d’une cellule (client) à la fin de la liste chainée.
ptr
203
tete ptr = ptr -> nextclt

202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

Othman 0667307027 NULL


Les étapes à suivre:

1. Création de la cellule avec malloc 320


2. Remplissage de la cellule par les données + mettre la valeur NULL dans le champ next_clt
3. Parcourir la liste jusqu’à l’arrivé à l’adresse de la dernière cellule de la liste.

53
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
6. L’ajout d’une cellule (client) à la fin de la liste chainée.
ptr
204
tete ptr = ptr -> nextclt

202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

Othman 0667307027 NULL


Les étapes à suivre:

1. Création de la cellule avec malloc 320


2. Remplissage de la cellule par les données + mettre la valeur NULL dans le champ next_clt
3. Parcourir la liste jusqu’à l’arrivé à l’adresse de la dernière cellule de la liste.
4. Faire lier l’ancienne dernière cellule avec la nouvelle.
54
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
6. L’ajout d’une cellule (client) à la fin de la liste chainée.

Exercice:

En utilisant une fonction ajoutFin(), écrire un programme qui permet d’ajouter des
nouveaux clients à la fin de la liste chainée.

55
@ de la dernière cellule

56
Chapitre 2: Les listes chainées
La taille et la recherche dans une liste chainée

Exercice:

Ecrire trois fonctions tailleList () et rechercheList() qui permettent de:

 tailleList () retourne sa taille (le nombre de cellules)


 rechercheList() recherche si un client existe dans la liste (Exemple liste client).

57
Chapitre 2: Les listes chainées
Taille d’une liste chainée.

58
Chapitre 2: Les listes chainées
Recherche un élément dans une liste chainée.

Appel de la fonction

59
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
7. L’ajout d’une cellule (client) au milieu de la liste chainée.
tete

202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

Objectif: Ajouter un nouveau client après le client Ali


Les étapes à suivre:
1. Vérifier que la liste n’est pas vide (tete != NULL).
2. Parcourir la liste jusqu’à l’arrivé à la cellule ou le client concerné clientX(=Ali).
3. Si le client existe, on va créer une nouvelle cellule avec malloc().
4. Remplir la nouvelle cellule par des données (Nom et Tél du client).
5. Faire lier le nouveau client avec le client qui suive le client recherché clientX(=Ali).
6. Faire lier le client recherché clientX(=Ali) avec le nouveau client.
N.B: l’ajout au milieu d’une liste chainée ne modifié par l’adresse de la tête de la liste 60
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
7. L’ajout d’une cellule (client) au milieu de la liste chainée.

Exercice:

En utilisant une procédure ajoutMilieu(), écrire un programme qui permet d’ajouter


un nouveau client après le client "Ali" .

61
62
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
8. Suppression dans une liste chainée
8.1 Suppression du début de la liste "Suppression de la première cellule"

 Pour libérer un espace mémoire créer d’une façon dynamique on fait


appel à la fonction free.

 Cette fonction prend un paramètre en l’occurrence, le pointeur de


bloc (cellule) qui doit être supprimé.
tete

202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

63
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
8. Suppression dans une liste chainée
8.1 Suppression du début de la liste "Suppression de la première cellule"

 Les étapes à suivre:


1. Vérifier que le liste n’est pas vide.
2. Déclarer un pointeur auxiliaire pour repérer la cellule à supprimer.
3. Modifier le contenu de la tête afin qu’elle puisse pointer sur la
nouvelle première cellule (ancienne 2 -ème cellule).
4. Supprimer la cellule concernée on libérant le pointeur auxiliaire.
tete

202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204


64
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
8. Suppression dans une liste chainée
8.1 Suppression du début de la liste "Suppression de la première cellule"
 Les étapes à suivre:
1. Vérifier que le liste n’est pas vide.
2. Déclarer un pointeur auxiliaire pour repérer la cellule à supprimer.
3. Modifier le contenu de la tête afin qu’elle puisse pointer sur la nouvelle première
cellule (ancienne 2 -ème cellule).
4. Supprimer la cellule concernée on libérant le pointeur auxiliaire.

65
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
8. Suppression dans une liste chainée
8.1 Suppression de la fin de la liste "Suppression de la dernière cellule"

 Il existe généralement deux cas de figures:


1) la liste contient une seule cellule.
2) la liste contient plusieurs cellules.

tete

202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

66
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
8. Suppression dans une liste chainée
8.1 Suppression de la fin de la liste "Suppression de la dernière cellule"

 Liste avec une seule cellule


Comment savoir si une liste contient une seule cellule ?
tete
1. Vérifier si tete->next_clt = NULL 202 Ahmed 0661170724 NULL
2. Si oui, libérer le pointeur tete avec la fonction free().
3. Affecter la valeur NULL au pointeur tete.
202

67
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
8. Suppression dans une liste chainée
8.1 Suppression de la fin de la liste "Suppression de la dernière cellule"

 Liste avec une plusieurs cellules

ptr =202

tete 202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

68
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
8. Suppression dans une liste chainée
8.1 Suppression de la fin de la liste "Suppression de la dernière cellule"

 Liste avec une plusieurs cellules

ptr

tete 202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

69
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
8. Suppression dans une liste chainée
8.1 Suppression de la fin de la liste "Suppression de la dernière cellule"

 Liste avec une plusieurs cellules


1- Parcourir la liste jusqu’à l’arrivé à la cellule avant dernière.

2- Libérer le pointeur (ptr->next_clt) avec la fonction free().
ptr

3- Affecter la valeur NULL au pointeur.


tete 202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

70
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
8. Suppression dans une liste chainée
8.1 Suppression de la fin de la liste "Suppression de la dernière cellule"

71

Vous aimerez peut-être aussi