# ####################################################################### EXERCICE 1 # ####################################################################### 1. a=1, b=3 2. a=5, b=6 3. a=5, b=3 4. a=6, b=12 5. a=18, b=12 # ####################################################################### EXERCICE 2 # ####################################################################### Partie 1 ======== Q1. fichier dico.h #define P 256 #define N 27 typedef int Dico[P] ; // Dico est le type tableau de booleen indice de 0 a 255 typedef char Chaine[N]; // Chaine est le type tableau de caracteres indice de 0 a 26 // Ici le type Dico est un type "tableau de chaines de caracteres" // Pour passer un parametre de type Dico en mode "donnee", "resultat" ou // "donnee-resultat" il suffit d'utilier un parametre de type D // (tous les passages se font en mode donnee-resultat) void Vide (Dico D) ; int estVide(Dico D) void Inserer (Chaine s ; Dico D) ; void Supprimer (Chaine s ; Dico D) ; int estPresent(Chaine s ; Dico D) ; Q2. fichier dico.h void Vide (Dico D) { int i; for (i=0; i

s, s) ; // on copie la chaine s dans le champ s de la nouvelle cellule tmp tmp->suivant = D[i] ; D[i] = tmp ; } void Supprimer (Chaine s ; Dico D) { int i ; Cellule *pred, *cour ; // suppression de la cellule contenant s dans la liste D[i] if (estPresent(s, S) { i = hash(s) ; if (!strcmp (D[i].s, s)) { // suppresion de l'element de tete pred = D[i] ; D[i] = D[i].suivant ; free(pred) ; } else { // suppresion d'un element non en tete pred = D[i] ; cour = D[i].suivant ; while (strcmp(cour.s, s) != 0) { pred = cour ; cour = cour->suivant ; } ; // cour contient la cellule a supprimer et pred son predecesseur pred->suiv = cour->suiv ; free(cour) ; } ; } int estPresent(Chaine s ; Dico D) { int i ; Cellule *cour ; i = hash(s) ; // recherche dans D[i] d'une cellule contenant s cour = D[i] ; while (cour != NULL && strcmp(cour.s, s) != 0) { cour = cour->suiv ; } ; return (cour != NULL) ; } Q7. int hash(Chaine s) { int r ; int i ; i=0; r=0 ; while (s[i] != '\0') r = r+s[i] ; return r % P ; } Partie 4 ========= Autre representation pour le type Dico ? On peut choisir une liste chainee de chaines de caracteres, avec une recherche sequentielle. Le fichier dico.h devient alors : typedef char Chaine[N]; // Chaine est le type tableau de caracteres indice de 0 a 26 typedef struct cellule { Chaine s; struct cellule *suivant; } Cellule ; typedef Cellule *Dico ; // Dico est le type pointeur sur Cellule void Vide (Dico *D) { *D = NULL ; } void Inserer (Chaine s ; Dico *D) { int i ; Cellule *tmp ; // insertion d'une cellule contenant s en tete de la liste D tmp = (Cellule) malloc(sizeof(Cellule)) ; strcpy (tmp->s, s) ; // on copie la chaine s dans le champ s de la nouvelle cellule tmp tmp->suivant = *D ; *D = tmp ; }