Vous êtes sur la page 1sur 73

Module : Structures de données et programmation

C++
Élément 1: Structures de données

Filière : Génie Informatique, Semestre 2


Année Universitaire 2020-2021

Pr. Rachid AIT DAOUD


Caractéristiques du cours
❑ Objectifs:
▪ Maitriser les structures de données de base et le principe de fonctionnement de chacune.
▪ Apprendre à concevoir des structures de données pour offrir une meilleure résolution d’u
problèmes.
▪ Être capable d’implanter ces structures dans le langage C .

❑ Pré-requis
▪ Algorithmique et programmation C

❑ En TD: Les bases et les exemples fondamentaux


▪ Tout ce qui est vu en TD doit être connu.

❑ En TP: Implantation des structures vues en cours


▪ Tout les TPs sont à finir et à rendre.

❑ Présentation des exposés


2
Plan du cours
Chapitre 1: Rappels
▪ Les pointeurs et la mémoire
▪ Mémoire et la déclaration des variables locales
▪ Passage par valeurs et passage par adresses
▪ Le mémoire dynamique
▪ Les tableaux dynamiques
▪ Les structures

Chapitre 2: Les listes


▪ Les listes chainées
▪ Manipulation des listes simplement chainées
▪ Manipulation des listes doublement chainées.

Chapitre 3: Les piles et les files


▪ Les piles
▪ Les files

Chapitre 4: Les arbres binaires


3
Chapitre 1: Rappels
1. Accès à la mémoire via les identificateurs des variables Memory
Les règles principales 10001 1 octet
10002
1. Chaque case mémoire est codée sur 1 octet (8bits)
10003
2. Chaque case mémoire (1 octet) est identifiée par une adresse spécifique. 10004

3. Le nombre d’octets réservé par le SE est dépend du type de la variable. 10005


(char: 1 octet, int: 2 ou 4 octets, long: 4 octets, pointeur: 4 octets, 10006
float: 4 octets, double: 8 octets) L
10007 1 octets
Exemple: char L
int age 10008
10009
10010 age
4 octets
10011
10012
10013 4
Chapitre 1: Rappels
1. Accès à la mémoire via les identificateurs des variables Memory
10001 1 octet
10002
1. Chaque case mémoire est codée sur 1 octet (8bits)
10003
2. Chaque case mémoire (1 octet) est identifiée par une adresse spécifique. 10004
10005
3. 3. Le nombre d’octets réservé par le SE est dépend du type de la variable.
(char: 1 octet, int: 2 ou 4 octets, long: 4 octets, pointeur: 4 octets, float: 4 10006
L
octets, double: 8 octets) 10007 1 octet
Exemple: char lettre 10008
int age
10009
4. L’adresse mémoire d’une variable est celle du dernièr octet 10010 age
Exemple: L’adresse mémoire de la variable age est: 4 octets
10011
10012
10013 5
Chapitre 1: Rappels
1. Accès à la mémoire via les identificateurs des variables Memory
10001 1 octet
10002
1. Chaque case mémoire est codée sur 1 octet (8bits)
10003
2. Chaque case mémoire (1 octet) est identifiée par une adresse spécifique. 10004
10005
3. 3. Le nombre d’octets réservé par le SE est dépend du type de la variable.
(char: 1 octet, int: 2 ou 4 octets, long: 4 octets, pointeur: 4 octets, float: 4 10006
octets, double: 8 octets) 10007 1 octet
Exemple: char lettre 10008
int age
10009
4. L’adresse mémoire d’une variable est celle du dernièr octet 10010 age
Exemple: L’adresse mémoire de la variable age est 10012 4 octets
10011
10012
10013 6
Chapitre 1: Rappels
2. Les pointeurs Memory
a
10001 1 octet

Les pointeurs: Variables spéciales qui contiennent l’adresse mémoire d’une 10002
autre variable. 10003
char a; 10004
char *p = &a;
10005 4 octets p

10006 10001
10007
10008
10009
10010
10011
10012
10013 7
Chapitre 1: Rappels
2. Les pointeurs Memory
b
10001
Considérons par exemple les instructions suivantes: 10002
4 octets
10003
10004
int b;
int *p = &b; 10005
10006
10007 4 octets p
10008 10004
10009
10010
10011
10012
10013 8
Chapitre 1: Rappels
2. Les pointeurs Memory Memory
b t
10001 10014
Considérons par exemple les 10002 4 octets 10015 4 octets
instructions suivantes:
10003 17 10016 10009
int b=17; 10004 10017
int *p = &b; 10005 10018
int ** t = &p; q
printf("%d", b); 10006 10019
printf("%d", &b); 10007 4 octets p 10020 4 octets
printf("%d", p); 10008 10004 10021 10017
printf("%d", *p);
printf("%d", t); 10009 10022
printf("%d", *t); 10010 10023
printf("%d", &t); 10011 10024
int ***q=&t;
printf("%d", *q); 10012 10025
printf("%d", **q); 10013 10026 9
printf("%d", ***q);
Chapitre 1: Rappels
3. Les variables locales

STACK S&G HEAP


100 200 300
102 202 302
103 203 303
Le mémoire Centrale (RAM) 104 204 304
105 205 305
106 206 306
107 207 307
Variables statiques Mémoire
Variables locales
et globales dynamique

10
Chapitre 1: Rappels
3. Les variables locales

STACK
100 Caractéristiques:
102
• Taille limitée (Windows: 1Mo; Linux: 8Mo)
103 • Divisée en sous parties selon le nombre de fonction.
104 • Allocation statique
105
106
107

Variables locales

11
Chapitre 1: Rappels
3. Les variables locales STACK
100
102
103
Part 1: main
104
105
106
107
108
109
110
Part 2: fonction1
111
112
113 12
Les deux variables lettre ont aucune relation entre
Chapitre 1: Rappels elles, chacune est déclarée dans une partie spécifique

3. Les variables locales STACK


100 E lettre
102
103
Part 1: main
104
105
106
107
108 E lettre
109
110
Part 2: fonction1
111
112
113 13
Les deux variables lettre ont aucune relation entre
Chapitre 1: Rappels elles, chacune est déclarée dans une partie spécifique

3. Les variables locales STACK


100 E lettre
102
103
Part 1: main
104
105
106
107
108 E lettre
109
110
Part 2: fonction1
111
112
113 14
Les deux variables lettre ont aucune relation entre
Chapitre 1: Rappels elles, chacune est déclarée dans une partie spécifique

3. Les variables locales STACK


100 E lettre
102
103
Part 1: main
104
105
106
107
108 A lettre
109
110
Part 2: fonction1
111
112
113 15
Chapitre 1: Rappels
3. Les variables locales STACK
100 E lettre
102
103
Part 1: main
104
pointeur 105
106
107
108 Lettre (pointeur)

109
110
100
Part 2: fonction1
111
112
113 16
Chapitre 1: Rappels
3. Les variables locales STACK
100 E lettre
102
103
Part 1: main
104
105
106
107
108 Lettre (pointeur)

109
110
100
Part 2: fonction1
111
112
113 17
Chapitre 1: Rappels
3. Les variables locales STACK
100 A lettre
102
103
Part 1: main
104
105
106
107
108 Lettre (pointeur)

109
110
100
Part 2: fonction1
111
112
113 18
Chapitre 1: Rappels
4. Mémoire dynamique Mémoire dynamique (illimité
Mémoire statique (limité 1 ou
selon l’espace libre de la mémoire)
8 Mo)

STACK HEAP
100 300
age 4 octets
302
102
17 303
24 • malloc
103
304 • calloc
104
• realloc
105 305 • free
106 306
p
107 307
304 308
108
109 309

Variables locales Mémoire


dynamique 19
Chapitre 1: Rappels
4. Mémoire dynamique Mémoire dynamique (illimité
Mémoire statique (limité 1 ou
selon l’espace libre de la mémoire)
8 Mo)

STACK HEAP
100 300
age 4 octets
102 302
103
17 303 • malloc
304 • calloc
104
• realloc
105 305 • free
106 306
p
107 307
304 308
108
109 309

Variables locales Mémoire


dynamique 20
Chapitre 1: Rappels
4. Mémoire dynamique Mémoire dynamique (illimité
Mémoire statique (limité 1 ou
selon l’espace libre de la mémoire)
8 Mo)

STACK HEAP
100 300
age 4 octets
102 302
103
17 303 • malloc
304 • calloc
104
• realloc
105 305 • free
106 306
p
107 307
108 308
109 309

Variables locales Mémoire


dynamique 21
Chapitre 1: Rappels
5. Les tableaux dynamiques

❑ Il existe deux types de tableaux :

▪ Les tableaux statiques: dont la taille est connue à la compilation.


▪ Les tableaux dynamiques: dont la taille est connue à l'exécution.

22
Chapitre 1: Rappels
5. Les tableaux dynamiques Mémoire dynamique (illimité
Mémoire statique (limité 1 ou
selon l’espace libre de la mémoire)
8 Mo)

STACK HEAP
300
100 303
103

104 Tab_static 304 16 octets


307
16 oct
107
308
108
111
311 • malloc
112
312
315
• calloc
115
316 • realloc
116
119
319
• free
320
120
123 303 323

124
Tab_dynamic324
327
127 4 oct 328
128
4 oct 131
331

332
132 335
135

Variables locales Mémoire


dynamique 23
Chapitre 1: Rappels
5. Les tableaux dynamiques

Exercice:

En utilisant un tableau dynamique, écrire un programme qui permet aux utilisateurs de saisir des notes
au clavier (le nombre de notes n’est pas fixe). On suppose que le nombre de notes à saisir par défaut est
égal à 3. (Au-delà de 3 notes le programme doit automatiquement augmenter la taille de la mémoire
dynamique).

24
Chapitre 1: Rappels
5. Les tableaux dynamiques

Exercice:
En utilisant un tableau dynamique,
écrire un programme qui permet aux
utilisateurs de saisir des notes au
clavier (le nombre de notes n’est pas
fixe). On suppose que le nombre de
notes à saisir par défaut est égal à 3.
(Au-delà de 3 notes le programme
doit automatiquement augmenter la
taille de la mémoire dynamique).

25
Chapitre 1: Rappels
6. Les structures

Une structure: Est un type de données défini par l'utilisateur en C / C++. Une structure crée un type de
données qui peut être utilisé pour grouper des éléments de types éventuellement différents en un seul type, la
première chose à réaliser est la description de celle-ci (techniquement, sa définition), c’est-à-dire préciser de
quel(s) champ(s) cette dernière va se composer.

26
Chapitre 1: Rappels
6. Les structures

27
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 202 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; 202
};
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 {
202 ? ? ?
char nom_clt[20];
long tel_clt;
struct client *next_clt;
202
};
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 202 ? ? ? cellule1


struct client { 202
char nom_clt[20];
long tel_clt; cell2 203 ? ? ? cellule2
struct client *next_clt;
};
203
struct client *tete = NULL;
tete = malloc(sizeof(struct client); cell3 204 cellule3
? ? ?
struct client *cell2 = malloc(sizeof(struct client);
struct client * cell3 = malloc(sizeof(struct client);
204
struct client * cell4 = malloc(sizeof(struct client);
cell4 205 ? ? ? cellule4

205

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 202 ? ? ?


203 cellule1
struct client { 202
char nom_clt[20];
long tel_clt; cell2 203 ? ? 204
? cellule2
struct client *next_clt;
};
203
struct client *tete = NULL;
tete = malloc(sizeof(struct client); cell3 204 cellule3
? ? ?
205
struct client * cell2 = malloc(sizeof(struct client);
struct client * cell3 = malloc(sizeof(struct client);
204
struct client * cell4 = malloc(sizeof(struct client);
tete ->next_clt = cell2; Pour cell4 205 ? ? ?
NULL cellule4
cell2 ->next_clt = cell3; faire
lier les
cell3 ->next_clt = cell4;
cellules
cell4 ->next_clt = NULL; entre 205
elles
39
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; 40
}
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 41
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
Programme complet (création, liaison, remplissage, affichage)

42
Travail à faire
"Faire une
description
schématique"
43
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 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.

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 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.

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

320
202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204

Othman 0667307027 202

320

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.

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).

47
48
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é à la dernière cellule de la liste.

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 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é à 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
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é à 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
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é à 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
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é à la dernière cellule de la liste.
4. Faire lier l’ancienne dernière cellule avec la nouvelle.
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.

Exercice:

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

54
55
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).

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

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

Appel de la fonction

58
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 59
Chapitre 2: Les listes chainées – Opérations sur les listes chainées
7. L’ajout d’une cellule (client) au milieu (Après) 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" .

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

Exercice:

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


un nouveau client avant le client "Ali" .

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

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"

✓ 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 qui doit être supprimé.
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.
tete

202 Ahmed 0661170724 203 Ali 0669188724 204 Omar 0723170717 NULL

202 203 204


65
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.

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 premiè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

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 premiè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

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 première cellule"

❑ Liste avec une plusieurs cellules

ptr =202

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 première cellule"

❑ Liste avec une plusieurs cellules

ptr

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 premiè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

71
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 première cellule"

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

A suivre …

73

Vous aimerez peut-être aussi