Solution de l’exercice 6.2

Avec les éléments dans le même ordre :

noeud* cree_liste(int nombre, element *tab){     if ( (nombre <= 0) || (!tab) ) return 0;     noeud *racine = new noeud(*tab++), *pn = racine;     while ( (--nombre > 0) && (pn) )         pn = new noeud(*tab++, pn);     return racine;}

On notera que cette fonction renvoie 0 si la racine n’a pu être créée, et une liste incomplète si tous les éléments n’ont pu être insérés faute de place en mémoire (condition &&(pn) dans la boucle).

Pour insérer dans l’ordre inverse, il suffit de toujours insérer derrière la racine, qui contient le dernier élément de la table :

noeud* cree_liste_inv(int nombre, element  *tab){     if ( (nombre <= 0) || (!tab) ) return 0;     noeud *racine = new noeud(*(tab + --nombre));     if (racine)         while ( (nombre-- > 0) & & (new noeud(*tab++, racine)) );     return racine;}

Ici aussi la liste est incomplète s’il n’y a pas assez de place en mémoire, mais ce sont les derniers éléments qui sont insérés.

On notera que ces deux fonctions n’utilisent pas les parties privées de la classe noeud. Il n’est donc pas nécessaire d’en faire des méthodes. Cela ne serait guère pratique, puisque pour appeler une méthode il faut une instance de la classe. Ici, il suffit d’écrire :

const N = ...// valeur fixeelement table[N] = { ... // liste des éléments };noeud *racine = cree_liste(N, table);

et la liste chaînée est construite. On aurait pu toutefois en faire des méthodes statiques.


Retour au texte.