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 na pu être créée, et une liste incomplète si tous les éléments nont pu être insérés faute de place en mémoire (condition &&(pn) dans la boucle).
Pour insérer dans lordre 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 sil ny 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 nutilisent pas les parties privées de la classe noeud. Il nest donc pas nécessaire den 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.