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.