1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| class ElemListe
{
public:
int valeur;
private:
ElemListe *suivant = nullptr;
ElemListe *precedent = nullptr;
friend class Liste;
};
class Liste
{
ElemListe *premier = nullptr;
ElemListe *dernier = nullptr;
public :
// Constructeur,
Liste() {}
// Destructeur
~Liste() {
while ( premier ) {
ElemListe *suivant = premier->suivant;
delete premier;
premier = suivant;
}
}
// Insère un élément en début de liste
void insererEnTete(int element) {
premier = new ElemListe{element,premier,nullptr};
if ( !dernier )
dernier = premier;
}
// Insère un élement en fin de liste
void insererEnQueue(int element) {
dernier= new ElemListe{element,nullptr,dernier};
if ( !premier )
premier = dernier;
}
const ElemListe* localiser(int element) const; // peut se faire par Iterateur et sentinelle
ElemListe* localiser(int element) { // idem sur une liste modifiable
return const_cast<ElemListe*>(localiser(element));
}
// Détermine si un élément appartient à la liste
bool appartient(int element) const {
return localiser(element) != nullptr;
}
// Supprime un élément de la liste (et donc la cellule associée)
void supprimer(int element) {
ElemListe* position = localiser(element);
if ( position ) {
if ( position->suivant )
position->suivant->precedent = position->precedent;
if ( position->precedent )
position->precedent->suivant = position->suivant;
if ( premier == position )
premier = position->suivant;
if ( dernier == position )
dernier = position->precedent;
}
}
// Affiche l'ensemble de la liste
void affiche(std::ostream& flux) const;
}; |