Les listes - Université de Corse

Transcription

Les listes - Université de Corse
Objectif
Première structure de données : Liste
Algorithmes et
Structures de Données
Chapitre 3 - Les listes
Définition itérative
Définition récursive
Primitives de manipulation des listes
Deux implémentations
Contiguë par tableau
Chaînée par pointeur
Capocchi Laurent
[email protected]
http://spe.univ-corse.fr/capocchiweb
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Définitions
Une liste = structure de données abstraite
Séquence de zéro ou de plusieurs éléments d’un type
donné
Contient un nombre potentiellement infini d'éléments
formant une séquence
Ces éléments sont tous de même type
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Déclaration
Déclaration d’une variable de type Liste d’Entier
Type Élément = Entier
Type Liste = …
Déclaration d’une variable de type Liste d’Entier
variable maListe : Liste
Listes d’entiers, de réels, etc.
Si « maListe » est vide on la notera ( )
(a1, a2, …, an)
Si elle n’est pas vide on notera chacun de ses éléments
entre parenthèses et séparés par des virgules
(1, 2, 3, 5, 0)
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Exemple de listes d'entiers
Les nombres premiers inférieurs à 20
( 1, 2, 3, 5, 7, 11, 13, 17, 19 )
liste ordonnée sans doubles
Les nombres de jours des mois d'une année non
bissextile
( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 )
liste non ordonnée, dont plusieurs éléments ont la même
valeur
Terminologie de base
Longueur = nombre d’éléments dans la liste
longueur = 0 est équivalent à Liste vide ()
Parties d’une liste
Tête : premier élément
Reste : reste de la liste sans la tête
Sous-liste, sous séquence
Préfixe, suffixe
Rang = ordre sur les places des éléments dans la liste
Ne pas confondre Rang et Position
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Liste Linéaire
Définition
Liste = suite finie, éventuellement vide, d’éléments de
même type repérés selon leur rang/place
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Liste Linéaire
Les listes
Suite finie, éventuellement vide, d’éléments de même
type repérés selon leur place/rang dans la liste
Ordre des éléments fondamental : ordre sur leur
rang/place dans la liste et non sur leur valeur
e1
Une liste est
La forme la plus courante d’organisation de données
Debut
e2
e3
ek
en
Fin
Utilisée pour stocker des données de manière
séquentielle
Une structure évolutive
Possibilité d’ajout et de suppression
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Définitions Itérative ou Récursive
Définition Itérative
ListeVide
Deux définitions
Définition itérative: Chaque élément permet
d'accéder à l'élément qui le suit
Début
Définition récursive: Chaque élément permet
d'accéder à la liste des éléments qui le suivent
Fin
ième – contenu - accès - suivant
ième(l,k) = ek= contenu(l,accès(l,k))
e1
e2
e3
ek
en
p : Position
suivant(p) = accès(l,3)
Fin
Début
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Définition Itérative
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Définition Itérative
longueur – insérer
supprimer
Longueur(l) = n
e1
e2
e3
ek
en
e1
insérer(l,3,z)
Début
Fin
e1
Début
Longueur(l) = n
e2
z
e3
ek
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
ek
en
Fin
e1
Fin
e3
supprimer(l,3)
Début
en
Longueur(l) = n+1
e2
Début
e3
ek
Longueur(l) = n-1
en
Fin
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Définition Itérative
Type Liste
Définition Itérative
Conditions d’utilisation
Utilise Rang, Position, Élément
Opérations en notation fonctionnelle
listeVide
: → Liste
accès
: Liste x Rang→ Position
contenu
: Liste x Position → Élément
ième
: Liste x Rang → Élément
longueur
: Liste → Entier
supprimer
: Liste x Rang → Liste
insérer
: Liste x Rang x Élément → Liste
suivant
: Position → Position
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Définition Récursive
Définition récursive
accès(l,k) est défini sssi 1 ≤ k ≤ longueur(l)
supprimer(l,k) est défini sssi 1 ≤ k ≤ longueur(l)
insérer(l,k,e) est défini sssi 1 ≤ k ≤ longueur(l)+1
ième(l,k) est défini sssi 1 ≤ k ≤ longueur(l)
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Définition Récursive
listeVide
Chaque élément permet d'accéder à la liste des
éléments qui le suivent
Début
Fin
une liste est
Soit vide
Soit constituée d’un premier élément suivi d’un reste
tête – premier - contenu
Le reste d’une liste est la liste privée de son premier
élément
e1
Début
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
e2
e3
ek
p : Position
p = tête(l)
premier(l) = e1= contenu(l,tête(l))
en
Fin
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Définition Récursive
Définition Récursive
reste - suivant
e1
e2
construire
e3
ek
en
reste(l)
Début
e1
Fin
e2
e3
ek
en
Début
Fin
construire(z,l)
e2
e3
ek
en
z
Début
e1
e2
e3
ek
en
Fin
suivant(tête(l)) = tête(reste(l))
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Définition Récursive
Type Liste
Début
Fin
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Définition Récursive
Conditions d’utilisation
Utilise Rang, Position, Élément
Opérations
listeVide
: → Liste
tête
: Liste → Position
reste
: Liste → Liste
construire
: Élément x Liste → Liste
premier
: Liste → Élément
contenu
: Position → Élément
suivant
: Position → Position
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
tête(l,k) est défini ssi l listeVide
reste(l) est défini ssi l listeVide
premier(l) est défini ssi l listeVide
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Définition Récursive
Les formulations itératives et récursives sont
équivalentes
Extensions du Type Liste
Copie d'une liste : Obtenir une copie d'une liste, dupliquer
une liste
copier : Liste -> Liste
Exprimer premier, reste et construire en fonction de
ième, insérer et supprimer
Concaténation de deux listes : Construire une liste en
mettant deux listes bout à bout
premier (l) =ième(l,0)
reste(l) = supprimer(l,0)
construire(l,e) = insérer(l,0,e)
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Extensions du Type Liste
concaténer : Liste x Liste -> Liste
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Implémentations
Deux façons
Recherche d'un élément dans une liste : Rechercher si un
élément est présent dans une liste et, dans ce cas, à
retourner la place/rang de cet élément
Contiguë : par tableau
Taille fixe
rechercher : Liste x Élément -> Rang
Taille variable
Chaînée : par pointeur
Opération non définie si l'élément recherché n'est pas
présent dans la liste.
On se donne donc l'opération
estPrésent : Liste x Élément -> Booléen
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Avec cellule de tête
Doublement chaînée
Circulaire
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Implémentation contigue
Implémentation contigue
Les éléments sont rangés les uns à côté des autres,
dans un tableau
La ième case du tableau contient la ième élément de la liste
Le rang = la position : Entier
Tableau [1..N] de Éléments : il y a N éléments mais on
n'offre pas la possibilité de modifier N
Comment changer le nombre d'élément qu'il y a dans
le tableau ?
Où est ce nombre dans la structure de données ?
type Position = Entier
type Liste = Tableau [1..N] de Éléments
type ListeT = Structure
tab : Tableau [1 .. LMAX] Élément
longueur : Entier // longueur
LMAX
finStructure
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Implémentation contigue
Implémentation contigue
Remarque : La longueur maximale de la liste, LMAX,
doit être déterminée
Type ListeT = Structure de
tab : Tableau [1 .. LMAX] de Élément
longueur : 0 .. LMAX
//nombre effectif d’élément
finStructure
t
1
e1
2
e2
3
n
e3
..
en
LMAX
..
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
longueur
n
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Tableau de taille fixe
Lors de création on réserve pour LMAX éléments
Penser à tester lors des insertions à ne pas dépasser
LMAX et à mettre à jour longueur
procédure insérer(e-s l:Liste, e r:Rang, e e:Élément)
Variable locale …
si l.longueur=LMAX alors
écrire( ‘ erreur : taille de la liste dépassée ’ )
siNon
// …
l.longueur <- l.longueur+1
finProcédure insérer
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Implémentation contigue
Tableau de taille variable
À chaque fois que l'on ajoute un élément, on change de
zone contiguë allouée
Allocation par blocs
Au départ on réserve pour NB
Si on dépasse NB lors d'un ajout, on re-alloue pour
2*NB éléments
Implémentation contigue
Méthode relativement bien adaptée aux listes itératives,
Méthode mal adaptée aux listes récursives
Avantages
Accès facile au ième élément
Insertion et suppression du dernier élément faciles
Longueur facile à obtenir
Inconvénients
Connaissance de la longueur maximale de la liste
Insertion et suppression coûteuses
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Exercices
Exercices
Représentation contiguë des listes
Représentation contiguë des listes
Écrire les primitives des listes itératives à l'aide de cette
représentation
listeVide
procédure listeVide(l: ListeT)
début
listeVide
longueur
ième
insérer
supprimer
Type ListeT = Structure de
tab : Tableau [1 .. LMAX] de Élément
longueur : 0 .. LMAX
l.longueur <- 0
finlistVide
longueur
fonction longueur(l: ListeT): Entier
début
retourne l.longueur
finlongueur
finStructure
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Exercices
Exercices
Représentation contiguë des listes
Représentation contiguë des listes
ième
fonction ieme(l: ListeT, rang: Entier): Element
début
si rang=1 alors
retourne l.tab[0]
finsi
si rang >=1 et rang<longueur(l) alors
retourne l.tab[rang-1]
sinon
Erreur
// dépassement de capacité
finsi
finieme
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
insérer
Procédure inserer (var l: ListeT, n: Entier, d: Element)
variable i: Entier
début
si longueur(l)=LMAX alors
Erreur
// tableau plein
finsi
si n<1 ou n>longueur(l)+1 alors
Erreur
// dépassement de capacité
sinon
pour i<-longueur(l) à n-1
l.tab[i] <- l.tab[i-1]
finpour
l.tab[n-1] <- d
l.longueur <- longueur(l)+1
finsi
fininserer
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Exercices
Implémentation Chaînée
Représentation contiguë des listes
Les éléments ne sont pas les uns à coté des autres
Besoin de connaître pour chaque éléments la position
(adresse) de l'élément qui suit
Positon rang, l'adresse d'une structure contient
l'élément ainsi que la position suivante
supprimer
procédure supprimer(var l: ListT, n:Entier)
variable i: Entier
début
si (n>= 1) et (n<=longueur(l)) alors
pour i<-n-1 à longueur(l) faire
l.tab[i]<-l.tab[i+1]
finpour
l.longueur <- longueur(l)-1
sinon
Erreur // Dépassement de capacité
finsi
finsupprimer
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Type PtrCellule = ↑Cellule
Type Cellule = Structure
valeur : Élément
suivant : PtrCellule
finStructure
Type ListeP = Structure
numElem: Entier
tete: PtrCellule
finStructure
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Implémentation Chaînée
Variantes : Augmentation de la mémoire
On utilise des pointeurs pour chaîner entre eux les
éléments successifs
Si on ne veut pas traiter à part le cas de la 1er cellule
La liste sera alors déterminée par l'adresse de son
premier élément
Définir la tête de la liste comme une cellule ordinaire
Mettre une cellule « tampon » en tête de la liste
Facilité pour l’insertion/suppression en début de liste
l
e1
e2
e3
Liste chaînée avec cellule de tête
e4 nil
" l " n'est plus la position de la première cellule
La cellule « tampon » est toujours là
Liste vide = liste contenant la cellule « tampon »
l
e1
e2
e3
e4 nil
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Variantes : Augmentation de la mémoire
Variantes : Augmentation de la mémoire
Listes doublement chaînées
Certaines actions demandent de parcourir la liste à
l'envers
Listes chaînées circulaires
Le dernier élément pointe sur le premier
Type Cellule = Structure
valeur : Élément
suivant : ↑Cellule
précédent : ↑Cellule
finStructure
l
e1
e2
e3
e4
listes circulaires simplement chaînées
l
e1
e2
e3
e4
Penser à le mettre à jour dans toutes les primitives
listes circulaires doublement chaînées
l
e1
e2
e3
e4
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Exercices
Exercices
Représentation chaînée des listes
Représentation contiguë des listes
Écrire les primitives des listes itératives à l'aide de cette
représentation
Écrire les primitives des listes récursives à l'aide de cette
représentation
listeVide
fonction listeVide()
début
retourne nil
finlistVide
longueur
fonction longueur(l: ListeP): Entier
début
retourne l.numElem
finlongueur
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Exercices
Exercices
Représentation contiguë des listes
Représentation contiguë des listes
ième
fonction ieme(l: ListeP, rang: Entier): Element
variable p: PtrCellule = l.tete
k:Entier
début
si rang>longueur(l) ou !estVide(l) alors
Erreur // dépassement ou liste vide
finsi
pour k<-1 jusqu'à rang faire
p<-p->suivant
retourne p->valeur
finieme
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
insérer
Procédure inserer (var l: ListeT, n: Entier, d: Element)
début
si estVide(l)
retourne Erreur
si (n-1 = 0)
insererApres(nil,l,d);
sinon
insererApres(rangToMaillon(l,n-1),l,d);
fininserer
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Exercices
Exercices
Représentation contiguë des listes
Représentation contiguë des listes
insérerAprès
Procédure insererApres(var l: ListeT, p PtrMaillon, d:
Element)
variable nouv_element: PtrMaillon
début
obtenir(p) //allocation
p->valeur <- e
si p = nil alors // insertion en tête
(nouv_element->suivant)<-(l->tete)
(l->tete) <- nouv_element
sinon
(nouv_element->suivant) <- (p->suivant)
(p->suivant) <- nouv_element;
finsi
l->numElem++
fininsererApres
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
supprimer
procédure supprimer(var l: ListP, n:Entier)
début
si estVide(l) et n <= longueur(l) alors
Erreur
finsi
si(n-1 = 0) alors
supprimerTete(l)
sinon
supprimerSuiv(rangToMaillon(l,n-1),l)
finsi
finsupprimer
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Exercices
Exercices
Représentation contiguë des listes
Représentation contiguë des listes
supprimerTête
procédure supprimerTete(var l: ListP)
ancien_maillon : PtrMaillon
début
si estVide(l) alors
Erreur
finsi
ancien_maillon <- l->tete
l->tete <- suivant(l->tete)
libérer(ancien_maillon);
l->numElem-finsupprimerTete
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
supprimerSuiv
procédure supprimerSuiv(p: Ptr_Maillon, var l: ListP)
ancien_maillon : PtrMaillon
début
si estVide(l) alors Erreur
finsi
si(suivant(p) = nil) alors //liste contient un maillon
supprimerTete(l)
sinon // gestion de suppression autre qu'en tête
si( suivant(p) = nil) Erreur
finsi
// ancien maillon après p
ancien_maillon <- suivant(p)
p->suivant <- p->suivant->suivant
libérer(ancien_maillon)
l->NumElem-finsupprimerSuiv
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données
Bibliographie et Webographie
C. PAOLI, Cours d'algorithmes et structures de données
Université de Corse - IUP NTIC2 2005/2006 – Algorithmes et Structures de Données