Académique Documents
Professionnel Documents
Culture Documents
Département d’informatique
Module I31
2 Récursivité 3
3 Références et structures 6
5 Les piles 11
6 Les listes 13
7 Les arbres 15
Remerciement Merci à Odile Papini de m’avoir fourni les sources latex de ses TD et
TP d’Algorithmique et structures de données des années 2003-2005, à partir desquels j’ai
pu compiler ce fascicule.
res de données
2
1 Tableaux
Exercice 1.1 (TD)
On souhaite représenter des vecteurs de TAILLE entiers où TAILLE est fixé a priori.
1. Définir en langage C la macro-constante TAILLE.
2. Écrire en langage C une définition du type abstrait de données vecteur pour
représenter les vecteurs de TAILLE entiers.
3. Écrire en langage C une déclaration d’un vecteur v de TAILLE entiers dans la
fonction main.
4. Écrire en langage C et tester les fonctions de l’exercice 1.1 en passant le tableau
comme arguments à la fonction.
5. (facultatif) Écrire la fonction int produit scalaire(vecteur x, vecteur y) qui
calcule et retourne le produit scalaire des deux vecteurs. On rappelle que le produit
scalaire de deux vecteurs X = (x1 , · · · , xTAILLE ) et Y = (y1 , · · · , yTAILLE ) est égal à
x1 .y1 + · · · + xTAILLE .yTAILLE
Écrire en langage C, au choix, l’un des algorithmes de tri sur les tableaux suivants (les
deux autres étant facultatifs) :
1. tri selection
2. tri insertion
3. tri bulles
2 Récursivité
Exercice 2.1 (TD) Nombres de Fibonacci
Soit un tableau T [inf, sup] dont inf et sup sont respectivement, le plus petit et le plus
grand indice du tableau. Il s’agit de trier les éléments du tableau par ordre croissant. Le
tri rapide est basé sur les considérations suivantes :
– Si inf ≥ sup alors T est vide ou réduit à un seul élément, donc trié.
– Si inf < sup, soit P = T [inf ] le pivot, on commence par ranger les éléments de T
autour du pivot, c’est-à-dire à placer le pivot P en position IP de telle sorte que
1. Écrire en langage C la fonction itérative int pgcd it (int a, int b) qui retourne le
plus grand commun diviseur de a et de b.
2. Écrire en langage C la fonction récursive int pgcd rec (int a, int b) qui retourne
le plus grand commun diviseur de a et de b.
3 Références et structures
Exercice 3.1 (TD)
1. Écrire l’algorithme d’une fonction permuter qui permet de permuter deux entiers.
Écrire ensuite cette fonction en langage C, puis écrire la fonction main qui appelle
la fonction permuter et qui affiche les deux entiers avant et après permutation.
2. Écrire l’algorithme d’une fonction mod qui remplace un entier x par le reste de
la division de x par n. Écrire ensuite cette fonction en langage C, puis écrire une
fonction main qui appelle mod et qui affiche l’entier avant et après l’appel de mod.
Un nombre complexe est constitué d’une partie réelle et d’une partie imaginaire.
1. Construire le type abstrait de données complexe approprié pour représenter un
nombre complexe.
2. Écrire les algorithmes des fonctions suivantes :
– creercomplexe(r : réel, i : réel) : complexe
– reelle(c : complexe) : réel
– imaginaire(c : complexe) : réel
– module(c : complexe) : réel
– affichercomplexe(c : complexe)
3. Construire le type abstrait de données approprié pour représenter la référence à
un nombre complexe et écrire l’algorithme de la fonction permutercomplexe qui
permet de permuter deux nombres complexes.
4. Écrire en langage C les définitions de types appropriés et les fonctions creercomplexe
et permutercomplexe. Pourquoi est-il nécessaire d’utiliser la fonction malloc dans
la fonction creercomplexe ?
On suppose qu’une société dispose de fiches où sont répertoriés les employés. Chaque fiche
dispose d’un numéro, d’un nom de famille, d’un prénom.
1. Construire les types abstraits de données appropriés pour représenter une fiche.
Il s’agit de déterminer tous les nombres premiers inférieurs à une valeur donnée N par
la méthode du crible d’Erastothène. La méthode consiste à dresser une liste des nombres
considérés de 1 à N et à y rayer les nombres multiples d’entiers.
1. Donner l’algorithme de la fonction crible.
2. Donner une première version en C de la fonction crible statique, c’est-à-dire dans le
cas où le nombre maximal N est connu et constant (allocation statique).
3. Donner une deuxième version en C de la fonction crible dynamique, c’est-à-dire
dans le cas où le nombre maximal N n’est pas constant et est fourni en argument à
fonction (allocation dynamique).
Soit le T.A.D. défini en cours pour représenter les polynômes à coefficients entiers.
Donner le nom poly à Structure(deg : entier, coef : Tableau(MAXDEG,entier)).
1. Écrire les algorithmes pour les fonctions de manipulation des polynômes suivantes :
(a) lirepoly() : poly qui permet de saisir le degré du polynôme ainsi que ses
coefficients.
(b) afficherpoly(p : poly) qui permet d’afficher le polynôme.
(c) coef(p : poly, j : entier) : entier qui retourne le coefficient correspondant
à l’exposant j spécifié comme argument.
(d) insere(p : poly, c : entier, j : entier) : poly qui permet d’insérer un terme
d’exposant j et de coefficient c spécifiés comme arguments.
Soit le type abstrait de données string défini en cours pour représenter les chaı̂nes de
caractères.
Donner le nom string à Ref(caractère).
Écrire les algorithmes pour les fonctions de manipulation des chaı̂nes de caractères
suivantes :
1. lirechaine() : string qui permet de saisir une chaı̂ne de caractères.
2. chainevide() : string qui retourne la chaı̂ne vide.
3. est vide(s : string) : booléen qui indique si la chaı̂ne spécifiée comme argument
est vide ou pas.
4. longueur(s : string) : entier qui retourne la longueur de la chaı̂ne de caractères
spécifiée comme argument.
5. concat(s1 : string, s2 : string) : string qui retourne une chaı̂ne de caractères
dont les éléments sont ceux de la première chaı̂ne de caractères suivis de ceux de la
deuxième chaı̂ne de caractères.
6. (facultatif) substr(s : string, p1 : entier, p2 : entier) : string qui retourne
la sous chaı̂ne de caractères contenant les caractères de la chaı̂ne s, de la position
p1 à la position p2. Par exemple, substr(”Bonjour”,3,6) retourne ”jour”.
5 Les piles
Exercice 5.1 (TD) Représentation séquentielle
Soit la représentation séquentielle pour le type abstrait de données pile défini en cours
pour une pile d’entiers :
Donner le nom pile à Structure(sommet : entier, s : Tableau(n, entier))
Donner le nom ppile à Ref(pile)
Écrire les algorithmes pour les fonctions de manipulation de la pile suivantes :
1. creer pile() : pile qui renvoie une pile initialisée avec une pile vide.
2. pile vide(p : pile) : booléen qui indique si la pile spécifiée en argument est vide
ou pas.
3. sommet pile(p : pile) : entier qui retourne le sommet de la pile spécifiée en
argument.
4. empiler(x : entier, ptr : ppile) qui permet d’empiler un élément spécifié comme
argument dans la pile référencée par la référence spécifiée comme argument.
5. depiler(ptr : ppile) : entier qui permet de dépiler la pile référencée par la référence
spécifiée comme argument et de retourner l’élément dépilé.
6. afficherpile(ptr : ppile) qui permet de parcourir la pile référencée par la référence
spécifiée comme argument et d’afficher les éléments de la pile.
Soit maintenant, la représentation chaı̂née pour le type abstrait de données pile défini en
cours :
Donner le nom element à Structure(cour : entier, suiv : pelement)
Donner le nom pelement à Ref(element)
Donner le nom pile à Ref(element)
Donner le nom ppile à Ref(pile)
Écrire les algorithmes pour les fonctions de manipulation de la pile suivantes :
1. creer pile() : ppile qui permet de créer une pile référencée par la référence spécifiée
comme argument en l’initialisant avec une pile vide.
2. pile vide(ptr : ppile) : booléen qui indique si la pile référencée par la référence
spécifiée en argument est vide ou pas.
3. empiler(x : entier, ptr : ppile) qui permet d’empiler un élément spécifié comme
argument dans la pile référencée par la référence spécifiée comme argument.
4. depiler(ptr : ppile) : entier qui permet de dépiler la pile référencée par la référence
spécifiée comme argument et de retourner l’élément dépilé.
5. afficherpile(ptr : ppile) qui permet de parcourir la pile référencée par la référence
spécifiée comme argument et d’afficher les éléments de la pile.
6 Les listes
Exercice 6.1 (TD)
Soit la représentation chaı̂née pour le type abstrait de données liste défini en cours pour
une liste d’entiers :
Donner le nom element à Structure(el : entier, suiv : pelement)
Donner le nom pelement à Ref(element)
Donner le nom liste à Ref(element)
Donner le nom pliste à Ref(liste)
Écrire les algorithmes pour les fonctions de manipulation de liste suivantes :
1. compter rec(ptrl : pliste) : entier qui compte récursivement le nombre d’entiers
contenus dans la liste.
2. compter it(ptrl : pliste) : entier qui compte itérativement le nombre d’entiers
contenus dans la liste.
3. appartient(x : entier, ptrl : pliste) : booléen qui renvoie un booléen qui indique
si l’entier passé en argument appartient à la liste référencée par la référence spécifiée
comme argument.
4. prem position(x : entier, ptrl : pliste) : pelement qui renvoie la position
(référence) de la première occurrence (par rapport au début de liste) de l’entier passé
en argument dans la liste référencée par la référence spécifiée comme argument.
5. (facultatif) prem rang(x : entier, ptrl : pliste) : entier qui renvoie la position
(rang) de la première occurrence (par rapport au début de liste) de l’entier passé en
argument dans la liste référencée par la référence spécifiée comme argument.
6. list position(x : entier, ptrl : pliste) : pliste qui renvoie une référence à une
nouvelle liste contenant les positions (rang) des occurrences de l’entier passé en
argument dans la liste référencée par la référence spécifiée comme argument.
7. (facultatif) concatener(ptrl1 : pliste, ptrl2 : pliste) qui permet de concaténer
une liste référencée par la référence spécifiée comme premier argument avec la liste
référencée par la référence spécifiée comme deuxième argument.
8. (facultatif) trier(ptrl : pliste) qui permet de trier récursivement la liste référencée
par la référence spécifiée comme argument.
Soit la représentation chaı̂née pour le type abstrait de données liste défini en cours
pour une liste d’entiers :
1. Écrire en langage C les définitions de types nécessaires à l’implantation d’une liste
chaı̂née pour représenter une liste d’entiers.
2. Écrire en langage C les fonctions de manipulation de listes suivantes :
(a) creer liste() : pliste qui permet de créer une liste et de l’initialiser avec une
liste vide.
(b) booléen liste vide(ptr : pliste) qui indique si la liste pointée par le pointeur
spécifié comme argument, est vide ou pas.
(c) inserer en tete(ptr : pliste, px : pelement) qui permet d’insérer px en
tête de la liste pointée par ptr.
(d) inserer apres (ptr : pliste, px : pelement, py : pelement) qui permet
d’insérer px après py dans la liste pointée par ptr.
(e) inserer en fin(ptr : pliste, px :pelement) qui permet d’insérer px en fin
de la liste pointée par ptr.
(f) extraire en tete(ptr : pliste) : pelement qui permet d’extraire un élément
en tête de la liste pointée par ptr.
(g) extraire apres(ptr : pliste, py : pelement) : pelement qui permet d’ex-
traire un élément situé après un élément py dans la liste pointée par ptr.
(h) extraire en fin(ptr : pliste) : pelement qui permet d’extraire un élément
en fin de la liste pointée par ptr.
(i) afficher it liste(ptr : pliste) qui permet de parcourir itérativement la liste
et d’afficher les éléments de la liste pointée par ptr.
(j) afficher rec liste(ptr : pliste) qui permet de parcourir récursivement la liste
et d’afficher les éléments de la liste pointée par ptr.
(k) detruire liste(ptr : pliste) qui permet de détruire une liste pointée par ptr.
7 Les arbres
Exercice 7.1 (TD) Parcours d’arbres
Soit un arbre binaire représentant une généalogie dont les noeuds sont étiquetés par
des lettres numérotées :
étiquette pére mère
A B1 B2
B1 C1 C2
B2 C3 C4
C1 D1 D2
C2 D3 D4
C3 D5 D6
C4 D7 D8
Quel sera le résultat de l’affichage si le parcours de l’arbre est effectué de façon :
1. préfixée ?
2. infixée ?
3. postfixée ?
Écrire les algorithmes pour les fonctions de manipulation des personnes suivantes :
1. nobody() : ppersonne qui permet d’initialiser un objet de type ppersonne avec
les champs nom et prénom initialisés avec une chaı̂ne vide et les champs père et
mère initialisés avec NULL.
2. creer personne() : ppersonne qui permet de remplir intéractivement les champs
de la personne, ainsi que ces ancêtres et qui renvoie un objet de type ppersonne.
Pour manipuler et évaluer des expressions arithmétiques, on utilise une structure d’arbre.
Les noeuds de l’arbre sont étiquetés par des entiers et des opérateurs arithmétiques, par
exemple, +, -, *.
1. Écrire la définition des types utilisés pour les expressions arithmétiques.
2. Écrire les algorithmes des fonctions de manipulation d’expressions arithmétiques :
– creer noeud qui crée un noeud de l’arbre.
– creer feuille qui crée une feuille de l’arbre.
– creer arbre qui crée un arbre.
– exp prefixe qui affiche l’expression de façon préfixée.
– exp infixe qui affiche l’expression de façon infixée.
– exp postfixe qui affiche l’expression de façon postfixée.
– rechercher noeud qui recherche le noeud de l’arbre qui contient l’opérateur
arithmétique en paramètre.
– evaluation qui évalue l’expression et affiche le résultat de l’évaluation.
– m a j expression qui met à jour une expression déjà existante en construisant
une nouvelle expression à partir de l’ancienne, d’un opérateur et d’un opérande
saisis au clavier.
– detruire expression qui détruit une expression.
Écrire en langage C les fonctions de parcours de la généalogie de l’exercice 7.2 ainsi qu’une
fonction main qui permet d’utiliser ces fonctions.
Soit un arbre binaire de questions, contenant pour chaque noeud, un pointeur vers le
texte correspondant à la question à poser, un pointeur vers le sous-arbre gauche des ques-
tions, un pointeur vers le sous-arbre droit des questions. Les questions sont booléennes,
on peut répondre par oui ou par non.
Par exemple, soit un arbre binaire dont les noeuds sont étiquetés comme suit :
1. Écrire en langage C une fonction poser questions qui permet de poser les ques-
tions d’une branche de l’arbre en fonction des réponses ( O (oui) et N (non)) de
l’utilisateur. Par exemple :
Est-ce un homme ? O
Est-ce un belge ? N
Est-ce Corto Maltese ? O
Fin des questions : vous avez gagné ! ! ! !
2. Écrire une fonction lister questions qui permet de lister de manière indentée les
questions de l’arbre.
3. Écrire une fonction inserer questions qui permet d’insérer une question à réponse
booléenne dans l’arbre. La nouvelle question est insérée au niveau d’une feuille après
avoir répondu aux questions qui mènent à cette feuille.
4. Écrire une fonction détruire arbre qui détruit l’arbre.
5. Écrire une fonction main comportant un menu permettant l’utilisation (conviviale
pour l’utilisateur) des fonctions de manipulation de l’arbre de questions.
Références
[1] M. Divay. Algorithmes et structures de données génériques. Dunod, 2004.
[2] J.P. Braquelaire. Méthodologie de la programmation en C. Dunod, 2000.
[3] T. Cormen, C. Leiserson et R. Rivest. Introduction à l’algorithmique. Dunod, 1994.