TP #4 de C++ : implémentation d'une classe template simple, notion d'itérateur

Exercice : la classe Liste Chaînée

Au cours du TP précédent, vous avez implémenté une classe Vecteur dans le but de redéfinir l'opérateur crochet d'accès aux éléments. Ici, nous allons explorer le monde fantastique et terrifiant à la fois des classes paramétrées ou template.

Le but est de créer une classe ListeChainee générique. Vous supposerez que les types d'instanciation du template disposeront des éléménts suivants :

  1. Constructeur par défaut
  2. Constructeur de recopie
  3. Opérateur d'affectation

Ces pré requis ne sont pas exorbitants car définis dans la forme canonique de Coplien ... et toute classe qui se respecte se doit d'être conforme à Coplien.

Rappelons qu'un itérateur est une balise de positionnement dans une collection.

Vous devrez fournir 3 classes :

Cellule
La cellule de liste chainée qui doit être aussi masquée que possible à l'utilisateur
Liste
La liste chaînée elle même
Iterateur
La classe d'itérateur sur la liste chaînée

A ce sujet il existe deux grandes variantes de programmation :

  1. Utiliser des classes imbriquées, c'est ma préférée car elle permet un meilleur masquage des informations.
  2. Utiliser des classes friend pour simplifier l'implémentation

Quelle variante allez vous choisir ? Il est évident que le code est plus simple (et sans doute plus efficace) en utilisant les friend, aussi je vous les recommanderai malgré mon aversion profonde pour cette technique.

Les opérations suivantes devront être disponibles sur la liste :

  1. Créer une liste vide
  2. Ajouter et retirer un élément en tête de liste
  3. Ajouter et retirer un élément en fin de liste
  4. Fournir en référence un accès au premier et au dernier élément de la liste
  5. Ajouter et un élément avant ou après un emplacement spécifié par un itérateur
  6. Remplacer l'élément spécifié par un itérateur
  7. Supprimer l'élément spécifié par un itérateur
  8. Fournir un itérateur sur le premier élément (réel) de la liste
  9. Fournir un itérateur sur l'élément fictif de la liste

Les opérations suivantes devront être fournies sur l'itérateur :

  1. Avancer
  2. Reculer
  3. Renvoyer une référence sur l'élément pointé par l'itérateur
  4. Une fonction renvoyant si deux itérateurs sont sur la même position

Quelques indications :

Les listes chaînées les plus simples à manipuler sont les listes doublement chaînées circulaires avec élément fictif. Le schéma suivant les illustre :

Liste doublement chaînée circulaire avec élément bidon

L'intérêt réside dans le fait que chaque élément a toujours un successeur et un prédécesseur (éventuellement lui même). On supprime ainsi tous les cas particuliers lors de l'insertion ou de la suppression.

En outre, vous n'avez besoin de conserver qu'un seul pointeur : celui sur l'élément fictif.

L'insertion d'un nouvel élément entre les cellules A et B se fait très simplement à l'aide des opérations numérotées :

Insertion d'un nouvel élément

De même, il est facile de supprimer la cellule B :

Suppression de l'élément B
Solution