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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
/*********Expression.cpp*************/
#include "Expression.h"
Expression::Expression(){
debut = NULL;
fin = NULL;
taille = 0;
}
Expression::~Expression(){
/* si la liste est vide, il n'y a rien à faire
* il n'y a que si elle ne l'est pas qu'il faudra tout libérer
*/
if(debut!=0)
{
/* il va nous falloir deux pointeurs "temporaires":
* le premier pour représenter l'élément à supprimer,
* le second pour représenter l'élément qui suit celui que l'on
* s'apprête à supprimer
*
* Le premier élément que nous supprimerons sera... le premier
* de la liste
* et, fatalement, son suivant sera celui qui le suit
*/
ElementListe *todel = debut;
ElementListe *suivant = todel->suivant;
/* nous allons maintenant travailler jusqu'à ce que l'élément qui
* suit celui qu'on a supprimé (ou qu'on est sur le point de
* supprimer) ne nous ramène sur le premier
*/
do
{
/* pour etre propre, mettons les liens à NULL */
todel->precedent = NULL;
todel->suivant = NULL;
/* et effacons l'élément */
delete todel;
/* l'élément suivant devient celui qui devra etre supprimé
*/
todel = suivant;
/* et l'élément qui le suit devient l'élément... qui suit celui
* qui doit être supprimé
*/
suivant = todel->suivant;
} while( suivant==debut );
} // fin de la vérification de liste vide
/* pour etre propre, mettons debut et fin à NULL */
debut = NULL;
fin = NULL;
cout << "everything is deleted !" ;
}
Expression& Expression::insert(int val)
{
/* création de l'élément à rajouter */
ElementListe *toadd = new ElementListe;
/*initialisation des membres */
toadd->donnee = val;
/* l'élément qui le précède est de toutes manière le dernier de la liste */
toadd->precedent = fin;
/* et celui qui le suit, étant donné que nous sommes dans une
* liste circulaire est de toutes manières le premier de la liste */
toadd->suivant = debut;
/* il est temps d'insérer l'élément dans la liste */
/* S'il existe un dernier élément dans la liste, nous faisons pointer sa
* référence "suivant" vers le nouvel élément*/
if(fin)
fin->suivant = toadd;
/* S'il existe un premier élément dans la liste, nous faisons pointer sa
* référence "precedent sur le nouvel element*/
if(debut)
debut->precedent = toadd;
else
{
/* par contre, si la liste est vide, le nouvel élément devient le
* premier de la liste, et ses deux références pointent vers
* lui-même
*/
debut = toadd;
toadd->precedent = toadd;
toadd->suivant = toadd;
}
/* quoi qu'il en soit, l'élément ajouté devient le dernier élément de
* la liste et nous mettons le nombre d'éléments à jour
*/
fin = toadd;
taille++;
/* nous pouvons maintenant renvoyer une référence sur notre liste
* circulaire
*/
return *this;
}
void Expression::affiche(){
ElementListe *courant;
courant = this->debut;
int i=0;
if (!this->taille)
cout << "la liste est vide !" << endl;
else{
cout << "[ " ;
while(i<(this->taille)){
cout << courant->donnee <<" " ;
courant = courant->suivant;
i++;
}
cout << "]" << endl;
}
} |
Partager