Voici une solution possible :
liste::~liste()// destructeur de la liste : supprime tous les noeuds{ if (!nombre) return; while (--nombre) delete courant->suivant(); delete courant;}void liste::avance(int combien)// avance du nombre indiqué dans la liste{ if (courant) if (combien > 0) while (combien--) courant = courant->suivant(); else if (combien < 0) while (combien++) courant = courant->precedent();}void liste::affiche(unsigned combien)// affiche combien éléments de la liste// (et nombre_elt au max){ if (combien > nombre) combien = nombre; while (combien--) { cout << '\t' << courant->contenu(); courant = courant->suivant(); } cout << '\n';}liste::liste(int n, const element* etab)// construit une liste de n éléments pointés par etab{ nombre = 0; courant = 0; if ( (n <= 0) || (!etab) ) return; noeud* np = 0; while ( (np = new noeud(*etab++, courant = np)) && (++nombre < n) ); if (np) courant = np->suivant();}inline int liste::insere(const element& e)// insère e à la position courante;// renvoie 0 si plus de place{ noeud *np = new noeud(e, courant->precedent()); if (np) { courant = np; nombre++; return 1; } else return 0;}void liste::supprime(int n)// supprimer le nombre indiqué d'éléments de la liste{ if (n >= nombre) n = nombre; while (n-- > 0) { courant = courant->suivant(); delete courant->precedent(); nombre--; } if (nombre == 0) courant = 0;}
Noter comme le constructeur et le destructeur de noeud
simplifient la tâche, en particulier dans insere
et supprime
.