L3 IUP AISEM/ICM Examen Algorithmique et C 15 Avril 2005 Durée 2h - Documents autorisées - Les exercices sont indépendants Exercice 1: Algorithme et complexité Soit un tableau de N entiers. a. Donner un algorithme permettant de déterminer si les éléments de ce tableau sont triés par ordre croissant ou pas. Cet algorithme pourra être décrit en pseudo-langage ou à l’aide d’un organigramme. b. Déterminer la complexité de votre algorithme, fonction de N, en nombre de comparaisons, – dans le pire des cas, – dans le meilleur des cas. c. Ecrire une fonction en C implémentant cet algorithme. Précisez les données d’entrée et de sortie de cette fonction. Exercice 2: Tables de hachage On souhaite stocker des nombres entiers positifs en utilisant une table de hachage. La table possédant N emplacements (de 0 à N-1), on utilise la clef suivante: h(x)=x modulo N. a. Calculer la valeur de la clé pour chacun des éléments de la liste suivante (N=12): 15, 24, 125, 4, 26, 6, 78, 55, 89 b. En supposant que les éléments soient inclus dans la table de hachage dans l’ordre de la liste et que la résolution des collisions soit faite en rajoutant un lien suivant à chaque emplacement de la table, dessiner la table obtenue. Remarque: Par convention un emplacemnt vide aura pour valeur -1 et un lien suivant non utilisé contiendra la valeur -1. c. Proposez une implémentation en C d’un emplacement la table de hachage sous la forme d’une structure. d. La table est représenté par un tableau dynamique de structures (du type défini ci-dessus). Ecrire le code en C d’une fonction permettant de créer et d’initialiser une table de hachage. Cette fonction aura pour entrée le nombre d’emplacements N de la table et pour sortie un pointeur vers le premier emplacement de la table. e. Donner l’algorithme et le code en C d’une fonction permettant de vérifier si un élément x est contenu dans la table. Exercice 3: Arbres binaires a. Dessiner le graphe de l’arbre binaire de recherche obtenu en insérant les éléments de la liste suivante dans leur ordre d’arrivée: 6, 78, 55, 89, 15, 24, 125, 3, 11 b. Un noeud d’un arbre binaire est représenté par la définition de structure suivante: typedef struct s_noeud { int valeur; struct s_noeud* gauche; struct s_noeud* droit; } t_noeud; Soit la fonction récursive suivante: void afficher(t_noeud* noeud) { if (noeud!=NULL) { afficher(noeud->gauche); printf("%d \n",noeud->valeur); afficher(noeud->droit); } } L3 IUP AISEM/ICM Examen Algorithmique et C 15 Avril 2005 – Donner ce qu’affiche à l’écran cette fonction en partant du noeud de valeur 15. – Même question en partant de la racine de l’arbre précédent. Dessiner sur le graphe le parcours des sommets. Exercice 4: Compléments de C Donner, en le justifiant, l’affichage produit par le programme suivant: #include <stdio.h> void void void void f1(int f2(int f3(int f4(int a, int * b) { a=*b;} * b, int c) { *b=c;} ** a, int b) {**a=b;} * a, int b) { f3(&a,b); } int main() { int n1=5, n2=8, n3=10; f1(n1,&n2); printf("apres f1: n1=%d, n2=%d, n3=%d\n",n1,n2,n3); f2(&n3,*(&n1)); printf("apres f2: n1=%d, n2=%d, n3=%d\n",n1,n2,n3); f4(&n3,n2); printf("apres f4: n1=%d, n2=%d, n3=%d\n",n1,n2,n3); return 0; } Exercice 5: Structures de données - Files On souhaite implémenter une file de nombres entiers de type FIFO à l’aide d’une liste simplement chaı̂née. Chaque élément de la file est représentée par une structure définie ainsi: typedef struct s_element { int valeur; struct s_element* suiv; } t_element; La file elle même est représentée par la structure suivante: typedef struct s_file { t_element *premier; t_element *dernier; } t_file; dans laquelle le champ premier est un pointeur vers le premier élément de la file et dernier un pointeur vers le dernier élément. Pour manipuler la file, on souhaite écrire 2 primitives: – une primitive inserer permettant d’inserer une valeur en dernière position de la file. – une primitive retirer permettant de supprimer le premier élément de la file en ayant préalablement renvoyé sa valeur. a. Dessiner une file (variable de type t file) contenant les 4 éléments suivants: 5, 22, 1, 8 (dans l’ordre d’arrivée, du premier au dernier) b. Dessiner la file précédente après l’insertion de l’élément 12. c. Dessiner maintenant la file après l’exécution de la primitive retirer et préciser la valeur renvoyée par la primitive. d. Donner les entrées/sorties de la primitive insérer et en déduire l’ interface en C de la fonction correspondante. e. Même question pour la primitive retirer.