Structures de données IFT-2000 Abder Alikacem Les listes ordonnées Programmation générique en C++ Semaine 3 Édition Septembre 2009 Département d’informatique et de génie logiciel
Laboratoire #3 Implantation d’une liste ordonnée Nous vous fournissons 3 packetages, un par projet/implantation que vous devez faire: tableau dynamique liste doublement chaînée liste circulaire Uniquement ceci pour cette semaine Dans chacun d'eux, vous devez compléter le fichier .inl étant donné le modèle d'implantation décrit dans la partie privée de la classe Liste. Bien entendu, les 3 implantations demandées doivent être génériques. Ces 2 main() fournis sont pour tester les 3 packetages (séparément), un main() pour instancier une liste ordonnée d'entiers et un autre pour déclarer une liste d'objets définis dans la classe ClasseTests.h que nous vous fournissons également.
Liste ordonnée Implantation dans un tableau dynamique Un tableau alloué du monceau (tas ou heap) Taille décidé par l’utilisateur #include <iostream> # include <stdexcept> using namespace std; #pragma warning( disable : 4290 ) template <typename T> class Liste { public: //… private: int tailleMax; // taille maximum de la liste int cpt; // cardinalité de la liste T * tab; // tableau "dynamique" contenant les éléments de la liste } ; #include "Liste.inl"
Gestion du tableau dynamique Il faut donc modifier le constructeur d’une liste: allouer un tableau sur le tas et dont le pointeur sera assigné à au membre privé tab. template <typename T> Liste<T>::Liste (int max) throw(bad_alloc) { tailleMax=max; cpt = 0; tab = new T [tailleMax]; } Le destructeur de la liste : Libération de l’espace du tableau pointé par tab Constructeur template <typename T> Liste<T>::~Liste () // Destructeur { delete [] tab ; cpt = tailleMax = 0; } Destructeur
Gestion du tableau dynamique Il ne faut pas oublier le constructeur de copie: allouer un tableau sur le tas et dont le pointeur sera assigné à au membre privé tab puis copier de l’instance source template <typename T> Liste<T>:: Liste(const Liste<T>& source) throw (bad_alloc) { tailleMax = source.tailleMax; cpt= source.cpt; tab = new T [tailleMax]; for (int position =0; position < source.cpt; ++position) tab[position]= source.tab[position]; } Constructeur de copie
Gestion du tableau dynamique et la surcharge de l’opérateur = allouer un tableau sur le tas et dont le pointeur sera assigné à au membre privé tab puis copier de l’instance source, ne pas oublier de nettoyer… template <typename T> Liste<T>& Liste<T>::operator = (const Liste<T>& l) throw(bad_alloc) { if (tab!=0) delete [] tab; //nettoyer ... tab=new T [l.tailleMax]; for (int i=0; i< l.cpt; i++) tab[i]=l .tab[i]; tailleMax=l.tailleMax; cpt=l.cpt; return (*this); } Surcharge de l’opérateur =