Algorithme et structures de données II Les pointeurs

publicité
ALGORITHME ET
STRUCTURES DE DONNÉES II
LES LISTES
Dr. Jihène Tounsi
ISG de Sousse
Site web http://www.jihenetounsi.com
Email: [email protected]
Sommaire



Liste simplement chaînée
Liste doublement chaînée
Liste circulaire
Liste simplement chaînée



Le nombre d’élément n’est pas connu à la création
de la liste
Une structure regroupant de données de même
type
Les données sont chaînées entre eux par des
pointeurs.
 Un
élément de la liste pointe sur l’élément suivant
 Le dernier élément ne pointe sur rien (Pointeur Null)

Une liste est accessible seulement par sa tête
Cours développé par Dr. Jihène Tounsi
Structure

Déclaration d’un enregistrement représentant
l’élément de la liste avec les attributs
 Nom_Pointeur:^Type_élément
 Données:Type

Un Type Liste qui est un pointeur sur le premier
élément de la liste
 Liste:^Type_élément
Cours développé par Dr. Jihène Tounsi
Structure
Suivant = pointeur stockant l’@ de
l’élément suivant de la liste
Donnée
Suivant
Donnée
Suivant
Donnée
Suivant
Donnée
Suivant
@ du 1er élément de la
liste
Liste (ou p comme le cours)= pointeur sur le premier
élément de la liste
Cours développé par Dr. Jihène Tounsi
Exemple 1
Algorithme Exemple_Liste_Chaînée;
Type
//Le nœud de la liste
element = enregistrement
Donnée:entier //l’information à enregistrer
Suivant:^element //pointeur vers l’élément suivant
Fin enregistrement
Liste=^element
Variables
L:Liste //équivalent à p du cours C’est le pointeur
vers le premier noeud
Debut
….
Fin.
Les opérations sur les listes chaînées

Opérations de création de liste
 Création

Liste vide
Opérations d’accessibilité
 Afficher
la longueur de la liste
 Afficher si Liste vide ou non
 Retourner Tête de la liste
 Retourner fin de la liste
Les opérations sur les listes chaînées

Opérations de modification
 Ajout
début de liste
 Ajout Fin de la liste
 Insertion à un rang donné
…

Opérations d’affichage
 Recherche
d’un élément
 Affichage de tous les éléments
Dans ce qui suit des exemples d’implémentation de quelques fonctions
Fonction CréerListeVide() :Liste
Algorithme Exemple_Liste_Chaînée;
Type
Element = enregistrement
Donnée:entier
Suivant:^element
Fin enregistrement
Liste=^element
Fonction CréerListeVide():Liste
Debut
Retourner Null
Fin fonction.
Variables
L:Liste
Debut
//Utilisation de la fonction dans le programme
principal ou affecter null au pointeur tête de liste
LCréerListeVide(); //Lnull
Fin.
Fonction EstVide(l:Liste) :Booléen
Algorithme Exemple_Liste_Chaînée;
Type
Element = enregistrement
Donnée:entier
Suivant:^element
Fin enregistrement
Liste=^element
Fonction EstVide(l:Liste):Booléen
Debut
Si (l ==null) alors
Retourner Vrai
Sinon
Retourner Faux
Fin fonction.
Variables
L:Liste
Debut
…
Fin.
Fonction longueur(l:Liste) :entier
Algorithme Exemple_Liste_Chaînée;
Type
Element = enregistrement
Donnée:entier
Suivant:^element
Fin enregistrement
Liste=^element
Fonction longueur(l:Liste):entier //Retourner le nbr d’éléments
N:entier
P:Liste
Debut
Pl
Si (Non(EstVide(l))) alors
N1
Tant que (P^.suivant <>null)
NN+1
PP^.suivant
Fin Tant que
Sinon
N0
Fin Si
Retourner(N)
Fin fonction.
….
Fonction Accès(l:Liste, r:entier) :Liste
Algorithme Exemple_Liste_Chaînée;
….
Fonction Accès(l:Liste, r: entier):Liste //Retourner une sous liste à partir d’un rang donné
N:entier
P:Liste
Debut
//l e rang est correcte
Si (1<=r et r<= longueur(l)) alors
//Obtenir 1er élément de la liste. N servira à compter le nombre d’éléments parcourus jusqu’à arriver
au rang recherché
N1
//Pour ne pas perdre la tête de la liste créer un pointeur intermédiaire pour se déplacer
Pl
//faire le parcours jusqu’à N arrive au rang escompté
Tant que (N<R)
//Accéder à l’élément suivant
NN+1
PP^.suivant
Fin Tant que
Sinon
Ecrire(« rang incorrecte »)
PNull
Fin Si
Retourner(P)
Fin fonction.
Autres Fonctions d’accès
Accès Premier élément
Algorithme Exemple_Liste_Chaînée;
….
Fonction Accès_PremierElement(l:Liste):Liste
Debut
Retourner(Accès(l,1))
Fin fonction.
Accès dernier élément
Algorithme Exemple_Liste_Chaînée;
….
Fonction Accès_DernierElement(l:Liste):Liste
Debut
Retourner(Accès(l,longueur(l)))
Fin fonction.
Procédure ajouterTêteListe(l:liste,e:entier)
Procédure ajouterTêteListe(l:Liste, e:entier)
N:entier
NC:Liste
Debut
//Allouer Dynamiquement une nouvelle cellule
Nouveau(NC)
Si (NC) alors
NC^.donnéee
Si (Estvide(l)) alors
//Créer le premier élément de la liste
NC^.suivantNull
lNC
Sinon
//Créer le premier élément de la liste et le chaîner aux restes des éléments
NC^.suivantl
lNC
Fin si
Sinon
Ecrire(« Mémoire Insuffisante »)
Fin si
Fin fonction.
Procédure ajouterFinListe(l:liste,e:entier)
Procédure ajouterfinListe(l:Liste par adresse, e:entier)
N:entier
P,NC:Liste
Debut
Si (Estvide(l)) alors
// le premier élément et aussi le dernier de la liste
ajouterTêteListe(l,e)
Sinon
//Allouer Dynamiquement une nouvelle cellule
Nouveau(NC)
Si (NC) alors
NC^.donnéee
//accéder au dernier élément
Paccès(l,longueur(l))
//le dernier élément de la liste doit pointer sur NC
P^.suivantNC
//NC est maintenant le dernier élément donc il n’a pas de suivant
NC^.suivantnull
Sinon
Ecrire(« Mémoire Insuffisante »)
Fin si
Fin Si
Fin fonction.
Procédure Insérer(l:liste,e:entier,r: entier)
Procédure Insérer(l:Liste, e:entier,r: entier)
N:entier
P,NC:Liste
Debut
Si (1<=r et r<= longueur(l)+1) alors
Si (r==1) alors
//ajout début de la liste
ajouterTêteListe(l,e)
Sinon
Si (r== longueur(l)+1) alors
//ajout Fin de la liste
ajouterfinListe(l,e)
Sinon
//ajout au sein de la liste donc accéder
au rang-1
Paccès(l,r-1)
//Allouer Dynamiquement une nouvelle
cellule
Nouveau(NC)
//L’allocation ne peut avoir lieu que s’il
y a de l’espace Mémoire suffisant sinon
Nouveau retourne NULL
Si(NC) alors
NC^.donnéee
NC^.suivantP^.suivant
P^.suivantNC
Sinon
Ecrire(« Mémoire Insuffisante »)
Fin si
Fin Si
Fin Si
Sinon
Ecrire(« rang incorrecte »)
Fin Si
Fin fonction.
Sommaire



Liste simplement chaînée
Liste doublement chaînée
Liste circulaire
Liste doublement chaînée


C’est une variante de la liste simplement chaînée
Les données sont chaînées entre eux par deux
pointeurs.
 Un
élément de la liste pointe sur l’élément suivant et sur
l’élément précédent
 Le dernier élément pointe seulement sur son
prédécesseur
 Le premier élément pointe seulement sur son successeur

Une liste est accessible par sa tête. Le pointeur
pointe toujours sur le premier élément.
Cours développé par Dr. Jihène Tounsi
Structure
Suivant = pointeur stockant l’@ de
l’élément suivant de la liste
prec
Donnée
Suiv
prec
Donnée
Suiv
prec
Donnée
Suiv
Suivant = pointeur stockant l’@ de
l’élément précédent de la liste
@ du 1er élément de la
liste
Liste = pointeur sur le premier élément de la liste
Cours développé par Dr. Jihène Tounsi
Exemple 1
Algorithme Exemple_Liste_Chaînée;
Type
Element = enregistrement
Donnée:entier
Suiv:^element
Prec:Liste //equivalent à ^element
Fin enregistrement
Liste=^element
Variables
L:Liste
Debut
….
Fin.
Sommaire



Liste simplement chaînée
Liste doublement chaînée
Liste circulaire
Liste circulaire


Même chose que la liste doublement chaînée
Les données sont chaînées entre eux par deux
pointeurs.
 Un
élément de la liste pointe sur l’élément suivant et
l’élément précédent
 Le dernier élément pointe sur son prédécesseur mais
aussi sur le premier élément de la liste
 Le premier élément peut pointer soit:
 Seulement
sur son successeur (structure circulaire uni-sens)
 Ou sur son successeur et son prédécesseur (dernier élément
de la liste) (structure circulaire double sens).
Cours développé par Dr. Jihène Tounsi
Structure circulaire uni-sens
Suivant = pointeur stockant l’@ de
l’élément suivant de la liste
prec
Donnée
Suiv
prec
Donnée
prec
Suiv
Donnée
Suiv
Suivant = pointeur stockant l’@ de
l’élément précédent de la liste
@ du 1er élément de la
liste
Liste = pointeur sur le premier élément de la liste
Cours développé par Dr. Jihène Tounsi
Structure circulaire double sens
prec
Donnée
Suiv
prec
Donnée
Suiv
prec
Donnée
Suiv
Cours développé par Dr. Jihène Tounsi
Application



Écrire une procédure qui permet d’afficher la liste
simplement chaînée de personnes. Une personne est
défini par son nom, son CIN et son genre (F ou M).
Même chose pour une liste doublement chaînée
Même chose pour une liste circulaire
Que peut on conclure??

Fin chapitre 2….
Téléchargement
Study collections