Vous êtes sur la page 1sur 20

Programmation avancée

Listes chainées

EL Moukhtar ZEMMOURI
ENSAM – Meknès
Version – 2022/2023

Définitions

E. Zemmouri, ENSAM - Meknès 2


Listes, pourquoi?

• Pour stocker des éléments de même type,


on utilise un tableau à une dimension.
t
o Les éléments d’un tableau sont successif en mémoire.

• è Problèmes :
o Taille fixe du tableau
o L’insertion nécessite un décalage

o La suppression nécessite un décalage

• À l’aide des structures et des pointeurs on peut créer


des structures de données plus flexibles!
o è Les listes chaînées

E. Zemmouri, ENSAM - Meknès 3

Définition

• Une liste est une structure de données contenant un ensemble d’éléments de même type qui
sont chainés entre eux.
o C’est une structure de données qui facilite l’ajout et la suppression d’éléments.

• Une liste simple est une liste telle que chaque élément contient :
o Une donnée (des informations caractéristiques de l’application).
o Un pointeur vers l’élément suivant ou une marque de fin s’il n’y a pas d’élément successeur.

premier

Ali Hassan Alice Bob


10 17 15 12

E. Zemmouri, ENSAM - Meknès 4


Représentation mémoire et déclaration

• Définition d’un type structure : element de liste typedef struct element {


• Exemple pour une liste d’entiers TypeListe donnee;
• Exemple pour une liste de complexes struct element * suivant;

• Remarques : } Element;

o Le champs data dépend de l’application de la liste


è la définition de son type doit être séparée de la définition
typedef struct element {
de la liste. int donnee;
o Dans la définition de la liste on peut aussi ajouter quelques struct element * suivant;
caractéristiques de la liste : } Element;

• Pointeur sur le premier élément typedef struct complexe {


• Pointeur sur le dernier élément float x;
float y;
• Nombre d’éléments } complexe ;
• Ordre
typedef struct element {
• N.B. Le type Element est parfois noté Cellule ou Noeud. complexe donnee;
struct element * suivant;
} Element;
E. Zemmouri, ENSAM - Meknès 5

Autres types de liste

• Listes doublement chainées


o Chaque élément est relié avec l’élément suivant et l’élément précédent.
o è Un élément contient une donnée et deux pointeurs

premier dernier

Ali Hassan Alice Bob


10 17 15 12

E. Zemmouri, ENSAM - Meknès 6


Autres types de liste

• Listes circulaires
o Le pointeur du dernier élément pointe sur le premier élément,
au lieu de la marque de fin (NULL)

premier

Ali Hassan Alice Bob


10 17 15 12

E. Zemmouri, ENSAM - Meknès 7

Gestion d’une liste

E. Zemmouri, ENSAM - Meknès 8


Gestion d’une liste

• Pour la gestion d’une liste chainée on doit disposer des fonctions suivantes :
o Création et initialisation d’une liste vide

o Teste si la liste est vide


o Nombre d’éléments de la liste

o Recherche d’une valeur dans la liste

• Le plus souvent, les fonctions à programmer dépendent de l’application.

E. Zemmouri, ENSAM - Meknès 9

Gestion d’une liste

• Pour la gestion d’une liste chainée on doit disposer des fonctions suivantes :
o Ajouter un élément en tête de liste

o Ajouter un élément en fin de liste


o Insérer un élément (après un élément donné)

o Insérer un élément dans une liste triée

• Le plus souvent, les fonctions à programmer dépendent de l’application.

E. Zemmouri, ENSAM - Meknès 10


Gestion d’une liste

• Pour la gestion d’une liste chainées on doit disposer des fonctions suivantes :
o Supprimer l’élément en tête de liste

o Supprimer l’élément en fin de liste


o Supprimer l’élément après un élément donné

o Supprimer la première occurrence d’une valeur


o Supprimer toutes les occurrences d’une valeur

• Le plus souvent, les fonctions à programmer dépendent de l’application.

E. Zemmouri, ENSAM - Meknès 11

Gestion d’une liste

• Pour la gestion d’une liste chainées on doit disposer des fonctions suivantes :
o Création d’une copie de la liste è copy

o Destruction de la liste è clear

• Le plus souvent, les fonctions à programmer dépendent de l’application.

E. Zemmouri, ENSAM - Meknès 12


Module de gestion d’une liste
- Listes simples -

E. Zemmouri, ENSAM - Meknès 13

Définition et initialisation

E. Zemmouri, ENSAM - Meknès 14


Définition de types

1. Définition du type des données à stocker dans la liste


typedef int TypeListe;
o Dans ce qui suit, on considère une liste d’entiers (int)

2. Définition du type structure : element de liste


typedef struct element {
o Contient deux champs : une données et un pointeur sur TypeListe donnee;
l’élément suivant struct element * suivant;
} Element;

E. Zemmouri, ENSAM - Meknès 15

Création et initialisation d’une liste vide

• Déclaration et initialisation de la liste vide

o On déclare un pointeur sur le premier élément de la liste

• è C’est la tête de liste Element * premier;


premier = NULL;
o On l’initialise par NULL

premier

E. Zemmouri, ENSAM - Meknès 16


Le programme

E. Zemmouri, ENSAM - Meknès 17

Ajout et suppression
au début et à la fin

E. Zemmouri, ENSAM - Meknès 18


Ajout en tête de liste

• Cas d’une liste vide :

• Cas d’une liste non vide :

E. Zemmouri, ENSAM - Meknès 19

Ajout en tête de liste

• Fonction pour ajouter une valeur au début d’une liste :

Element * ajouter_debut (Element * premier, TypeListe valeur){


Element * nouveau;
nouveau = new Element;
nouveau->donnee = valeur;
nouveau->suivant = premier;
return nouveau;
}

E. Zemmouri, ENSAM - Meknès 20


Ajout en fin de liste

• Cas d’une liste vide :

• Cas d’une liste non vide :

E. Zemmouri, ENSAM - Meknès 21

Ajout en fin de liste

• Fonction pour ajouter une valeur à la fin d’une liste :

Element * ajouter_fin (Element * premier, TypeListe valeur){


Element * nouveau = new Element;
nouveau->donnee = valeur;
nouveau->suivant = NULL;
if (premier == NULL) return nouveau;
Element *p = premier;
while (p->suivant != NULL){
p = p->suivant;
}
p->suivant = nouveau;
return premier;
}

E. Zemmouri, ENSAM - Meknès 22


Suppression au début

• Cas d’une liste vide :

• Cas d’une liste non vide :

E. Zemmouri, ENSAM - Meknès 23

Suppression au début

• Fonction de suppression au début d’une liste :

Element * supprimer_debut (Element * premier){


if (premier != NULL){
Element *p = premier;
premier = premier->suivant;
delete p;
}
return premier;
}

E. Zemmouri, ENSAM - Meknès 24


Suppression à la fin

• Liste vide

• Liste contenant un seul élément

• Liste avec plus que deux éléments

E. Zemmouri, ENSAM - Meknès 25

Suppression à la fin

• Fonction de suppression à la fin d’une liste :


Element * supprimer_fin (Element * premier){
if (premier == NULL) return NULL; // la liste est vide
if (premier->suivant == NULL){ // la liste contenant un seul élément
delete premier;
return NULL;
}
// la liste contient plus que 2 éléments
Element *p = premier;
while (p->suivant->suivant != NULL){
p = p->suivant;
}
delete p->suivant;
p->suivant = NULL;
return premier;
}

E. Zemmouri, ENSAM - Meknès 26


Insertion et suppression

E. Zemmouri, ENSAM - Meknès 27

Insertion dans une liste

• Insertion d’une valeur donnée à une position pos donnée de la liste


o On suppose le premier élément d'indice 0
o Si la position pos <= 0 alors on insère au début
o Si la position pos >= taille de la liste alors on insère à la fin

E. Zemmouri, ENSAM - Meknès 28


Insertion dans une liste

• Fonction d’insertion :

Element * inserer (Element * premier, TypeListe valeur, int pos){


if (premier == NULL || pos<=0) return ajouter_debut (premier, valeur);
int i = 0;
Element *p = premier;
while (i<pos-1 && p->suivant != NULL){
i++;
p = p->suivant;
}
Element *nouveau = new Element;
nouveau->donnee = valeur;
nouveau->suivant = p->suivant;
p->suivant = nouveau;
return premier;
}

E. Zemmouri, ENSAM - Meknès 29

Suppression dans une liste

• Suppression d’un élément à une position pos donnée


o On suppose le premier élément d'indice 0
o Si la position pos < 0 alors on ne supprime rien
o Si la position pos >= taille de la liste alors ne supprime rien

E. Zemmouri, ENSAM - Meknès 30


Suppression dans une liste

• Fonction de suppression :
Element * supprimer (Element * premier, int pos){
if (premier == NULL || pos<0) return premier;
if (premier->suivant == NULL || pos==0) return supprimer_debut (premier);
int i = 1;
Element *p = premier;
while (i<pos && p->suivant->suivant != NULL){
i++;
p = p->suivant;
}
if (i==pos){
Element *q = p->suivant;
p->suivant = q->suivant;
delete q;
}
return premier;
}

E. Zemmouri, ENSAM - Meknès 31

Parcours

E. Zemmouri, ENSAM - Meknès 32


Longueur d’une liste

• Fonction qui retourne le nombre d’éléments dans une liste

int longueur(Element * premier){


Element *p = premier;
int cpt = 0;
while (p){
p=p->suivant;
cpt ++;
}
return cpt;
}

E. Zemmouri, ENSAM - Meknès 33

Recherche dans une liste

• On cherche une valeur donnée dans une liste


o On retourne un pointeur sur la première occurrence de la valeur dans la liste,
ou NULL si la valeur n’existe pas dans la liste.

o On peux aussi retourner true/false, l’indice, …

Element * chercher(Element * premier, TypeListe valeur){


Element *p = premier;
while ( p != NULL){
if (p->donnee == valeur) return p; // La comparaison dépend du TypeListe
p = p->suivant;
}
return NULL;
}

E. Zemmouri, ENSAM - Meknès 34


Affichage de la liste

• Affichage des éléments d’une liste


o On doit disposer d’une fonction pour afficher une valeur de type TypeListe

void afficher (Element * premier){ void afficher_element (TypeListe valeur){


Element *p = premier; cout << valeur << endl;
cout << "\n------------------------------ \n"; }
cout << "Les valeurs de la liste sont : \n";
while (p != NULL){
afficher_element (p->donnee);
p = p->suivant;
}
cout << "------------------------------ \n\n";
}

E. Zemmouri, ENSAM - Meknès 35

Accès au début et fin

E. Zemmouri, ENSAM - Meknès 36


Accès au premier élément

• Fonction qui retourne la valeur de l’élément en tête de liste


o Ne doit pas être appelée si la liste est vide

TypeListe premier(Element * premier){


return premier->donnee;
}

E. Zemmouri, ENSAM - Meknès 37

Accès au dernier élément

• Fonction qui retourne la valeur du dernier élément de la liste


o Ne doit pas être appelée si la liste est vide

TypeListe dernier(Element * premier){


Element *p = premier;
while (p->suivant != NULL){
p=p->suivant;
}
return p->donnee;
}

E. Zemmouri, ENSAM - Meknès 38


Te s t l i s t e v i d e

• Fonction pour tester si une liste est vide


o Retourne true si la liste est vide et false si non

bool est_vide (Element * premier){


if (premier == NULL) return true;
else return false;
}

E. Zemmouri, ENSAM - Meknès 39

Programmation avancée

Listes chainées

EL Moukhtar ZEMMOURI
ENSAM – Meknès
Version – 1.0

Vous aimerez peut-être aussi