DL 1
DL 1
DL 1
L’objectif de ce devoir est de mettre en place une fonction permettant de construire une liste de chaı̂nes de
caractères telle qu’une chaı̂ne donnée ne peut y apparaı̂tre plus d’une fois.
3 Tri de la liste
La plupart des tris efficaces requièrent de pouvoir accéder rapidement à n’importe quel élément de la séquence
à trier. Les listes ne remplissent pas cette condition puisqu’on ne peut accéder aisément qu’à leur premier élément.
Une technique courante consiste à transformer, le temps du tri, la liste en tableau.
3.1. Écrire une fonction qui transforme une liste de chaı̂nes en un tableau de chaı̂nes, de prototype
char** array_from_list(list l).
Attention, cette fois les chaı̂nes ne doivent pas être recopiées.
1
3.2. Représenter l’état de la mémoire après les instructions suivantes
list l = cons("Mars", cons("Jupiter", cons("Saturne",NULL)));
char** t = array_from_list(l);
3.3. Écrivez un tri par insertion pour le tableau produit à la question 3.1 ; le prototype attendu est sort(char** t, int n)
où n correspond à la longueur du tableau t. Quelle est la complexité de ce tri en nombre de comparaisons
de chaı̂nes (appels à strcmp) ?
3.4. Enfin, écrivez une fonction recréant une liste à patir d’une tableau de chaı̂nes :
list list_from_array(char** t, int n)
où n est la taille du tableau t. Cette fois-ci les chaı̂nes devront être copiées lors de la création de la liste
(utilisez l’opération cons à cette effet).
devient
”aa” :: ”ab” :: ”abc” :: ”abd” :: ”zz” :: ∅
.
Conclusion du problème
Écrire une fonction list uniq(list l) qui à une liste quelconque associe une nouvelle liste en mémoire
contenant les mêmes chaı̂nes que l, mais débarassée de ses doublons, c’est-à-dire contenant chaque chaı̂ne de
caractères au plus une fois. Donner sa complexité au pire en nombre d’opérations sur les chaı̂nes (celles vues à
la section 1). Commentaire ?