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 dune insertion ou suppression sur lune, le champ nombre
de lautre 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 lincertitude sur lallocation mémoire. Si lon décidait dignorer 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 lautre constructeur (exercice précédent).
Naturellement, dautres méthodes peuvent encore être ajoutées : nous laissons ici limagination du lecteur travailler.