Retour sur l’exemple

Revenons à la liste chaînée qui nous a servi d’exemple précédemment. Quels constructeurs et destructeurs lui donner ?

Il est assez facile de voir qu’une telle classe ne doit pas avoir de constructeur par défaut. En effet, le noeud ne « vit » que pour conserver l’information element  ; il n’a aucun sens par lui-même. Par exemple créer un tableau de noeuds est un non-sens, puisqu’on définit cette classe pour servir dans une liste chaînée.

Un constructeur simple ayant pour argument un element permettra de définir une racine de liste (noeud seul dans une liste). Un autre constructeur, acceptant aussi un element, plus un pointeur sur un noeud, permettra de créer un nouveau noeud en l’insérant derrière l’autre.

Il est facile de faire un seul constructeur de ces deux, en utilisant les arguments par défaut. On obtient alors la définition de classe suivante :

class noeud {     noeud *suivt;    // le suivant dans la liste     element elm;     // information contenue     public :     noeud(element, noeud* = 0);         // constructeur     noeud(noeud& n) { elm = n.elm; }    // constructeur de copie     noeud *suivant(void) { return suivt; }     element &contenu(void) { return elm; }     noeud* supprime_svt(void);     noeud* insere(element);     };inline noeud::noeud(element e, noeud *precedent)// crée le noeud et l’insère derrière precedent // si non nul; sinon crée une racine{     elm = e;     if (precedent) {         suivt = precedent->suivt;         precedent->suivt = this;         }     else suivt = 0;}noeud* noeud::supprime_svt(void)// supprime le noeud suivant et renvoie un pointeur// sur le nouveau suivant{     if (!suivt) return 0;     // pas de suivant     noeud *s = suivt;     suivt = suivt->suivt;     delete s;     return suivt;}inline noeud* noeud::insere(element e)// insère un nouvel élément de valeur e derrière this.// renvoie 0 si plus de mémoire, sinon suivt.{     noeud *nouveau = new noeud(e, this);     return nouveau;}

Nous avons défini aussi un constructeur de copie qui ne recopie que la partie element de la classe ; en effet, recopier le pointeur serait ici une faute, puisqu’on sèmerait le désordre dans la liste chaînée.

On notera à quel point notre constructeur à deux paramètres simplifie la fonction d’insertion. Ces deux méthodes ont d’ailleurs été déclarées en ligne.

Exercice 6.2

Écrire une fonction qui crée une liste chaînée complète à partir d’un tableau d’éléments element. La fonction renverra un pointeur sur le premier noeud de la liste (racine). L’ordre des éléments de la liste devra être le même que dans le tableau. Écrire une seconde fonction identique, sauf que l’ordre de la liste devra être l’inverse de celui du tableau.

Voir solution
Précédent Précédent Sommaire Sommaire Suivant Suivant