#include #include "liste.hpp" using namespace std; Liste::Liste() { bidon = new Cellule(); bidon->next = bidon; } bool testListeVide(const Liste & l) { return (l.bidon == l.bidon->next); } Elem premierElement(const Liste & l) { return l.bidon->next->info; } Cellule * premiereCellule(const Liste & l) { return l.bidon->next; } Cellule * celluleSuivante(const Cellule *c,const Liste & l) { // Fin de la liste if(c->next == l.bidon) return NULL; return c->next; } Elem elementCellule(const Cellule * c) { return c->info; } #ifndef _RECURSIF void affichageListe(const Liste & l) { cout << "Liste (it) "; Cellule *temp=l.bidon->next; while(temp != l.bidon) { afficheElement(temp->info); temp=temp->next; } cout << endl; } #else //Procedure interne au module static void affichageListeDepuisCellule(const Cellule * c, const Liste & l) { if(c!=l.bidon) //il reste des cellules a afficher { afficheElement(c->info); affichageListeDepuisCellule(c->next,l); } } void affichageListe(const Liste & l) { cout << "Liste (rec) "; affichageListeDepuisCellule(l.bidon->next,l); cout << endl; } #endif void ajoutEnTete(const Elem & e,Liste & l) { //Creation d'une nouvelle Cellule Cellule *temp=new Cellule; temp->info=e; temp->next=l.bidon->next;//... qui pointe sur la premiere Cellule de l l.bidon->next = temp; } void suppressionEnTete(Liste & l) { Cellule *temp = l.bidon->next; //On memorise l'adresse de la premiere Cellule l.bidon->next=l.bidon->next->next; //La deuxieme Cellule de l devient la premiere delete temp;//L'espace occupe par la Cellule abandonnee est restitue } #ifndef _RECURSIF void videListe(Liste & l) { while(!testListeVide(l)) { suppressionEnTete(l); } } #else void videListe(Liste & l) { if(!testListeVide(l)) { suppressionEnTete(l); videListe(l); } } #endif void ajoutEnQueue(const Elem & e,Liste & l) { Cellule * temp = new Cellule(); temp->next = l.bidon->next; l.bidon->next = temp; l.bidon->info = e; l.bidon = temp; } Liste::Liste(const Liste & l) { bidon = new Cellule; bidon->next = bidon; if(!testListeVide(l)) { Cellule *temp1=l.bidon->next; ajoutEnQueue(temp1->info,*this); Cellule *temp2=bidon->next; temp1=temp1->next; while(temp1!=l.bidon) { //Il reste des elements a ajouter ajoutEnQueue(temp1->info,*this); temp2=temp2->next; //Ainsi temp2 pointe sur la derniere cellule de *this temp1=temp1->next; //tmp1 pointe sur la premiere Cellule de l // dont l'info n'a pas ete ajoutee a *this } } } Liste::~Liste() { videListe(*this); } Liste & Liste::operator=(const Liste & l) { if (this!=&l) { videListe(*this); if(!testListeVide(l)) { Cellule *temp1=l.bidon->next; ajoutEnQueue(temp1->info,*this); Cellule *temp2=bidon->next; temp1=temp1->next; while(temp1!=l.bidon) { //Il reste des elements a ajouter ajoutEnQueue(temp1->info,*this); temp2=temp2->next; //Ainsi temp2 pointe sur la derniere cellule de *this temp1=temp1->next; //tmp1 pointe sur la premiere Cellule de l // dont l'info n'a pas ete ajoutee a *this } } } return *this; }