Liste Une liste est une séquence d’éléments. Concept important: Chaque élément possède une position dans la liste. Notation: De quelles opérations a-t-on.

Slides:



Advertisements
Présentations similaires
Cours n° 7 Standard Template Library II.
Advertisements

Cours n° 6 Standard Template Library I.
C++ 6ème cours Patrick Reuter maître de conférences
Structures de données et complexité LIFO – FILO – FIFO – etc…
Cours n° 8 Conception et Programmation à Objets
1 UMLV 1. Introduction 2. Hachage ouvert 3. Hachage fermé 4. Implémentation des fonctions Méthodes de hachage.
L’ interruption de boucle
Algorithme et structure de données
Chap. 1 Structures séquentielles : listes linéaires
Lycée Louis Vincent SEANCE 6 Python Les listes Lundi 25 novembre 2013.
Structures collectives en Java
Structures de données linéaires
IPA – Catherine Faron Zucke et Anne Marie Deryr. suite ordonnée d'éléments de taille variable ArrayList liste; liste = new ArrayList (); Ne peuvent contenir.
Structures de données et algorithmes – C5 Maria-Iuliana Dascalu, PhD
Leçon 6 : Structures de données dynamiques IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier.
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
IFT-2000: Structures de Données Listes chaînées Dominic Genest, 2009.
Les tris.
Python La programmation objet
Structures de données IFT-2000
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
Ensembles Définition d’un ensemble. Opérations sur les ensembles. Accès, suppression et ajout d’éléments d’un ensemble. Fonctions permettant de manipuler.
Structures de données IFT-2000
Structures de données IFT-2000 Abder Alikacem Standard Template library Édition Septembre 2009 Département dinformatique et de génie logiciel.
Structures de données IFT-2000
Structures de données IFT-2000
Rappels Java.
Présentation Structures de Données et TDA
Les listes chaînées par Frédérick Henri.
Vector, Iterator, LinkedList
Les arbres binaires.
Piles Premier arrivé, dernier servi: LIFO (Last In, First Out) Liste à usage restreint: Enlève et insère un élément seulement à un bout de la liste. Notation:
Arbres binaires complets
Chapitre 9 Les sous-programmes.
COURS DE PROGRAMMATION ORIENTEE OBJET :
CSI3525: Concepts des Langages de Programmation Notes # 6: Langages de Programmation Fonctionelle II: Introduction au ML.
IFT-2000: Structures de données Piles et files Dominic Genest, 2009.

Structures de données IFT-2000
Structures de données IFT-10541
Structures de données IFT-2000 Abder Alikacem Semaine 11 Gestion des arbres binaires de tri et de recherche. Les arbres cousus. Les arbres n-aires Département.
Structures de données IFT-2000 Abder Alikacem Retour sur les listes ordonnées Département dinformatique et de génie logiciel Édition Septembre 2009.
Plan cours La notion de pointeur et d’adresse mémoire.
Structures de données IFT-2000
L’essentiel du langage C
Animateur : Med HAIJOUBI
Le langage C Structures de données
2.1 - Historique Chapitre 2 : Introduction au langage C++
LES PILES ET FILES.
La notion de type revisitée en POO
Un survol du language C.
Méthodes de tri.
Structures de données élémentaires dans le contexte du TP #1
ETNA – 1ème année Guillaume Belmas –
TABLEAUX des POINTEURS TRAITEMENT DE STRUCTURES
C# de plus près.  Ce sont globalement les mêmes que Java : ◦ Int(int16, int32), float, double, bool,…  Les classe « communes » sont également les mêmes.
Conception de Programmes - IUT de Paris - 1ère année – Cours 8 – Les entrées/sorties Comment fonctionnent les opérateurs > pour les types élémentaires.
Tutorat en bio-informatique Le 15 novembre Exercices 1 et 2 (MAT1400) - solutions Chapitre 12.2, Analyse - concepts et contextes vol. 2 19) Calculez.
Structures de données élémentaires
1 UMLV  FICHIERS Mémoire de masse découpée en blocs Fichier :liste chaînée de blocs, ou arbre de blocs (répertoires - fichiers)‏ Bloc d’éléments Bloc.
Dictionnaire On veut une structure permettant d’insérer, d’enlever et de rechercher des enregistrements. Concepts importants: Clef de recherche: Décrit.
8PRO107 Éléments de programmation Les tableaux. Étude de cas 1 Description du problème : Lire une liste d’entiers et l’afficher d’abord dans le même ordre.
Structures de données IFT-2000
1 Listes des méthodes de la classe string, et exemples.
CSI2510 Structures des Données et Algorithmes
CSI1502: Principes fondamentaux de conception de logiciels Chapitre 12: Structures de données.
Les structures de base Listes chainées. Listes Les listes(similaire aux tableaux) sont des structures informatiques qui permettent de garder en mémoire.
Les arbres généraux.
Listes Chaînées.
Transcription de la présentation:

Liste Une liste est une séquence d’éléments. Concept important: Chaque élément possède une position dans la liste. Notation: De quelles opérations a-t-on besoin?

Opérations sur les listes Déterminer si un élément appartient à la liste Se déplacer dans la liste Déterminer la position courante Ajouter un élément à la position courante etc.

Concepts de base L’implémentation doit supporter le concept de position courante. Cela est fait en définissant la liste en termes de partition de doite et de gauche. Chacune de ces partitions peut être vide. Les partitions sont séparées par un séparateur (fence). L’élément courant est le premier élément de la partition de droite

Liste:Type de donnée abstrait template class List { public: virtual void clear() = 0; virtual bool insert(const Elem&) = 0; virtual bool append(const Elem&) = 0; virtual bool remove(Elem&) = 0; virtual void setStart() = 0; virtual void setEnd() = 0; virtual void prev() = 0; virtual void next() = 0;

Liste TDA (suite) virtual int leftLength() const = 0; virtual int rightLength() const = 0; virtual bool setPos(int pos) = 0; virtual bool getValue(Elem&) const = 0; virtual void print() const = 0; };

Liste: Exemples Liste: MaListe.insert(99); Résultat: Parcourir toute la liste: for ( MaListe.setStart(); MaListe.getValue(x); MaListe.next() ) Faire_quelque_chose(x);

Liste: fonction Find // Retourne vrai ssi K est dans la liste bool find(List & L, int K) { int x; for (L.setStart(); L.getValue(x); L.next()) if (K == x) return true; return false; }

Liste: Implémentation avec tableau

La classe Alist (1) template class AList : public List { private: int maxSize; // Taille max de la liste int listSize; // Nombre d’éléments int fence; // Position du séparateur Elem* listArray; // Tableau pour la liste public: AList(int size=DefaultListSize) { maxSize = size; listSize = fence = 0; listArray = new Elem[maxSize]; }

La classe Alist(2) ~AList() { delete [] listArray; } void clear() { delete [] listArray; listSize = fence = 0; listArray = new Elem[maxSize]; } void setStart() { fence = 0; } void setEnd() { fence = listSize; } void prev() { if (fence != 0) fence--; } void next() { if (fence <= listSize) fence++; } int leftLength() const { return fence; } int rightLength() const { return listSize - fence; }

La classe Alist(3) bool setPos(int pos) { if ((pos >= 0) && (pos <= listSize)) fence = pos; return (pos >= 0) && (pos <= listSize); } bool getValue(Elem& it) const { if (rightLength() == 0) return false; else { it = listArray[fence]; return true; } }

insert //Insère un élément au début de la //partition de droite template bool AList ::insert(const Elem& item) { if (listSize == maxSize) return false; for(int i=listSize; i>fence; i--) // Déplacer les éléments vers la droite listArray[i] = listArray[i-1]; listArray[fence] = item; listSize++; // Incrémente la taille return true; }

append //Ajoute un élément à la fin de la liste template bool AList ::append(const Elem& item){ if (listSize == maxSize) return false; listArray[listSize++] = item; return true; }

remove //Enlève et retourne le premier élément // de la partition de droite template bool AList ::remove(Elem& it) { if (rightLength() == 0) return false; it = listArray[fence]; for(int i=fence; i<listSize-1; i++) // Déplace les éléments vers la gauche listArray[i] = listArray[i+1]; listSize--; // Decrémente la taille return true; }

Implémentation d’une liste chaînée

La classe Link //Nœud pour liste simplement chaînée template class Link { public: Elem element; // Valeur associée au noeud Link *next; // Pointeur au nœud suivant Link(const Elem& elemval, Link* nextval =NULL) { element = elemval; next = nextval; } Link(Link* nextval =NULL) { next = nextval; } };

Position dans une liste chaînée(1)

Problème!

Position dans une liste chaînée(2)

La classe LList (1) // Implémentation d’une liste // simplement chaînée template class LList: public List { private: Link * head; // Pointe au début Link * tail; // Pointe à la fin Link * fence; // Sépareteur int leftcnt; // Nbre d’élém. à gauche int rightcnt; // Nbre d’élém. à droite void init() { // Initialisation fence = tail = head = new Link ; leftcnt = rightcnt = 0; }

La classe LList(2) void removeall() {// Libère l’espace mémoire while(head != NULL) { fence = head; head = head->next; delete fence; } public: LList(int size=DefaultListSize) { init(); } ~LList() { removeall(); } // Destructeur void clear() { removeall(); init(); }

La classe LList(3) void setStart() { fence = head; rightcnt += leftcnt; leftcnt = 0; } void setEnd() { fence = tail; leftcnt += rightcnt; rightcnt = 0; } void next() { //Ne fait rien s’il n’y a rien à droite if (fence != tail) { fence = fence->next; rightcnt--; leftcnt++; } }

La classe LList(4) int leftLength() const { return leftcnt; } int rightLength() const { return rightcnt; } bool getValue(Elem& it) const { if(rightLength() == 0) return false; it = fence->next->element; return true; }

Insertion

Insert/Append // Insère au début de la partition de droite template bool LList ::insert(const Elem& item){ fence->next = new Link (item, fence->next); if (tail == fence) tail = fence->next; rightcnt++; return true;} // Ajoute à la fin de la liste template bool LList ::append(const Elem& item){ tail = tail->next = new Link (item, NULL); rightcnt++; return true;}

Enlever un élément

Remove // Enlève et retourne le premier élément // de la partition de droite template bool LList ::remove(Elem& it) { if (fence->next == NULL) return false; it = fence->next->element; Link * ltemp = fence->next; fence->next = ltemp->next; if (tail == ltemp) tail = fence; delete ltemp; rightcnt--; return true; }

Prev // Se déplace au nœud précédent // Aucun changement s’il n’y a rien à gauche template void LList ::prev() { Link * temp = head; if (fence == head) return; //Rien à gauche while (temp->next!=fence) temp=temp->next; fence = temp; leftcnt--; rightcnt++; }

Setpos // Déplace le séparateur de sorte qu’il y // ait pos éléments à gauche template bool LList ::setPos(int pos) { if ((pos rightcnt+leftcnt)) return false; fence = head; for(int i=0; i<pos; i++) fence = fence->next; return true; }

Comparaison des implémentations Listes avec tableau: Insertion et retrait sont  (n). Précédent et accès direct sont  (1). Tout l’espace est alloué à l’avance. Pas d’espace autre que les valeurs. Listes chaînées: Insertion et retrait sont  (1). Précédent et accès direct sont  (n). L’espace augmente avec la liste. Chaque élément requiert de l’espace pour les pointeurs.

Comparaison de l’espace utilisé DE = n(P + E); n = DE P + E E: Space for data value. P: Space for pointer. D: Number of elements in array.

Liste doublement chaînée // Définition des nœuds template class Link { public: Elem element; Link *next; Link *prev; Link(const Elem& e, Link* prevp =NULL, Link* nextp =NULL) { element=e; prev=prevp; next=nextp; } Link(Link* prevp =NULL, Link* nextp =NULL) { prev = prevp; next = nextp; } };

Liste doublement chaînée

Insert

// Insérer au début de la partition // de droite template bool LList ::insert(const Elem& item) { fence->next = new Link (item, fence, fence->next); if (fence->next->next != NULL) fence->next->next->prev = fence->next; if (tail == fence) tail = fence->next; rightcnt++; return true; }

Remove

// Enlève l’élément courant // Retourne false en cas d’insuccès template bool LList ::remove(Elem& it) { if (fence->next == NULL) return false; it = fence->next->element; Link * ltemp = fence->next; if (ltemp->next != NULL) ltemp->next->prev = fence; else tail = fence; // Reset tail fence->next = ltemp->next; // Remove delete ltemp; // Libère l’espace rightcnt--; // Décrémente le compteur return true; }