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