Solution de l’exercice 6.5

Il paraît essentiel de créer un constructeur de copie, car la copie standard ne donnera pas le résultat correct, puisque les deux instances de liste désigneraient la même liste ; en particulier, lors d’une insertion ou suppression sur l’une, le champ nombre de l’autre deviendrait incorrect. Voici un tel constructeur de copie :

liste::liste(liste& ls){               // duplique toute la liste     courant = 0; nombre = 0;     if (!ls.nombre) return;     noeud *lscourant0 = ls.courant, *np = 0;     while ((np = new noeud(ls.valeur(), courant =np))             && (++nombre < ls.nombre) )         ls.avance();     ls.courant = lscourant0;    // rétablir initial     if (np) courant = np->suivant();}

Noter que la fonction est considérablement compliquée par l’incertitude sur l’allocation mémoire. Si l’on décidait d’ignorer ce problème, il suffirait en effet d’écrire :

liste::liste(liste& ls)                 // duplique toute la liste     courant = 0; nombre = ls.nombre;     for (int n = nombre; n; n--) {         ls.avance();         courant = new noeud(ls.valeur(), courant);         }}

La remarque vaut aussi pour l’autre constructeur (exercice précédent).

Naturellement, d’autres méthodes peuvent encore être ajoutées : nous laissons ici l’imagination du lecteur travailler.


Retour au texte.