Académique Documents
Professionnel Documents
Culture Documents
1/7
En choisissant le
prédécesseur ensuite le
successeur
En choisissant le successeur
ensuite le prédécesseur
5. Ecrire une fonction récursive qui permet de retourner le nombre des nœuds dans un niveau donnée.
NivC 0 // Niveau Courant, NivA : Niveau à Atteindre)
Fonction NNN (R : ptrN, NivC, NivA : entier) : entier
Si (R = Nil) alors retourner (0)
Sinon Si (NivC = NivA) alors retourner (1)
Sinon retourner (NNN(FG(R), NivC+1, NivA) + NNN(FD(R), NivC+1, NivA))
6. Ecrire une fonction récursive qui permet de vérifier si un arbre binaire est strictement binaire.
Fonction SB (R : ptrN) : booléen
Si (R = Nil) alors retourner (vrai
(vrai)
vrai)
Sinon Si (FG(R)
(FG(R) = FD(R) = Nil)
Nil) alors retourner (vrai
(vrai)
vrai)
Sinon Si ((FG(R) ≠Nil) et (FD(R) ≠Nil)) retourner (SB
(SB(FG(R)
SB(FG(R))
(FG(R)) et SB(FD(R)))
SB(FD(R)))
Sinon retourner (faux)
7. Ecrire une fonction qui permet de vérifier si un arbre binaire est complet. Vous pouvez utiliser
directement la fonction « profondeur(R : ptrN) : entier » qui retourne la profondeur de l’arbre R.
Plusieurs solutions possibles :
Solution itérative Solution récursive
Fonction Complet (R : ptrN) : entier Pf Profondeur (R)
pf Profondeur(R) Fonction Complet (R : ptrN,
ptrN, pf : entier)
entier) : booléen
i 0 Si (R = Nil) alors retourner (vrai)
TQ (i <=
<= pf) faire Sinon Si ((FG(R) = FD(R) = Nil) et (pf = 0)) alors
Si (NNN(R, i) = 2i) alors i++ retourner (vrai)
Sinon retourner (faux) Sinon Si ((FG(R) ≠Nil) et (FD(R) ≠Nil))
FTQ retourner (Complet
(Complet(FG(R)
Complet(FG(R),
(FG(R), pf-
pf-1) et
Retourner (vrai) Complet(FD(R)
Complet(FD(R),
(FD(R), pf-
pf-1))
Sinon retourner (faux)
2/7
Exercice2 (0.5 + 4.5 + 1+ 1 = 7 point):
Une Deque (double ended queue ou une file à
deux bouts) possède à la fois les propriétés d’une
pile et d’une file. Une Deque est définie par deux
extrémités : tête et queue. On peut donc
consulter, ajouter ou supprimer un élément à
chaque extrémité de la structure.
On considère une Deque comme une liste chainée de caractères. Ecrire en LANGAGE C :
1. les structures de données nécessaires pour définir une Deque.
(0.25) typedef struct maillon { (0.25) typedef struct Deque
char val ; {
struct maillon*suiv ; ptrM T;
}maillon; ptrM Q;
typedef maillon* ptrM; } Deque;
2. le modèle de Deque qui contient un ensemble d’opération permettant de la manipuler :
Nom Paramètres Rôle
InitDeque Deque Initialiser une Deque
DequeVide Deque Vérifier si une Deque est vide
Extremite Deque, sens Retourner l’élément qui se trouve soit en tête soit en queue (sans le
supprimer)
EnDequer Deque, x, sens Ajouter l’élément « x » soit en tête soit en queue
DeDequer Deque, x, sens Supprimer un élément soit en tête soit en queue et le retourner dans
«x»
sens est une variable définie pour désigner l’extrémité à utiliser. Elle sera égal à
- 1 si lecture/ajout/suppression en tête
- -1 si lecture/ajout/suppression en queue.
3/7
aff_suiv((*D).Q, P) If (sens == -1) { (1.25)
(1.25)
aff_suiv(P, NULL); ptrM P = (*D).T;
(*D).Q = P; *x = valeur((*D).Q
valeur((*D).Q);
} while (P != (*D).Q) P = suivant (P) ;
} if (P != (*D).T){
} aff_suiv(P, NULL) ;
void Dedequer
Dedequer (Deque *D, char* x, int sens) liberer (&((*D).Q))
{ (*D).Q = P ;
if (!DequeVide(*D)){ } else
if (sens == 1) { (0.75) {
*x = valeur((*D).T); DequeInit(D)
ptrM P=(*D).T; liberer(&P)
(*D).T=suivant((*D).T); }
liberer(&P); }
if ((*D).T == NULL) (*F).Q = NULL; }
} }
3. les opérations suivantes (en utilisant le modèle de Deque):
- Enfiler et défiler dans le cas où Deque est une file FIFO.
- Empiler et dépiler dans le cas où le Deque est une pile LIFO.
4. une fonction récursive qui permet de vérifier si le mot contenu dans une Deque est un palindrome (en
utilisant le modèle de Deque). Rappeler qu’un palindrome est un mot qui se lit de la même manière de
gauche à droite et de droite à gauche comme « radar », « été », « ressasser », « selles »…..
int palindrome (Deque D)
else {
else { (0.5)
} }
4/7
Exercice3 (0.5 + 2.5 = 3 points)
Un polynôme peut être représenté par une LLC triée dans l’ordre décroissant des puissances où chaque
maillon contient un monôme qui est représenté par un exposant et un coefficient (non nul). Par
exemple, le polynôme P(x) = 2x5+3x4 + 0.5x2 + 1 est représenté par la liste suivante :
type monome = structure type maillon = structure
coef :réel val : monome
puiss : entier positif suiv : * maillon
Fin Fin
type ptrM = * maillon
2. Soustraction (P, Q) qui retourne le résultat de la soustraction de deux polynômes P et Q (P-Q). Par
exemple, si P(x) = 2x5+3x4 + 0.5x2 +1 et Q(x) = 2x4 + 0.5x2 + 3x - 5 alors P-Q = 2x5+x4 -3 x +4
Exercice4
Exercice4 (1 + 1.25
1.25 + 1.75 = 4 points) :
Soit « IND » un index des mots qui est défini par un tableau « Tab » de taille n où chaque case du tableau
« Tab » contient un entier qui représente la longueur du mot et un pointeur vers une liste linéaire
chaînée unidirectionnelle. Cette liste contient des mots de même longueurs à raison d’un mot par
maillon. Le tableau est trié selon l’ordre décroissant de la longueur du mot. Les listes sont triées par
ordre alphabétique (ordre croissant de A à Z).
5/7
type maillon = structure Const Max = 100 ;
val : chaîne de caractères type index = structure
suiv : * maillon Tab: Tableau [Max] de case
Fin Queue :entier
type ptrM = * maillon Fin
type case = structure
long : entier
tête :ptrM
Fin
Dans le but d’insérer un mot dans cet index, il est demandé d’écrire les modules suivants:
1. La fonction récursive « RechSeqTab » qui permet de retourner l’indice de la case contenant une
longueur donnée (soit x) si elle existe, sinon l’indice de la case devant contenir la longueur « x ».
Fonction RechSeqTab(Tab : Tableau [] de case, x, n: entier)
Si n = 0 alors retourner (n
(n) (0.25)
(0.25)
Sinon
Si Tab[n-
Tab[n-1].long = x alors retourner (n-
(n-1) (0.25)
(0.25)
Sinon
Si Tab[n-
Tab[n-1].long < x alors retourner (RechSeqTab (Tab, x, n-
n-1)) (0.25)
(0.25)
Sinon retourner (n
(n) (0.25)
(0.25)
Fin
Ou bien
Fonction RechSeqTab(Tab : Tableau [] de case, i,x,n : entier)
Si i = n alors retourner (i
(i) (0.25)
(0.25)
Sinon
Si Tab[i].long = x alors retourner (i) (0.25)
(0.25)
Sinon
Si Tab[i].long > x alors retourner (RechSeqTab (Tab, i+1, x, n)) (0.25)
(0.25)
Sinon retourner (i
(i) (0.25)
(0.25)
Fin
2. La fonction récursive « InsLLC » qui permet d’insérer dans une liste linéaire chaînée ordonnée un
nouveau mot (i.e le mot ne doit pas exister déjà).
6/7
Retourner (P)
Sinon Si (cmpch
(cmpch(valeur(L),
ch(valeur(L), y)<0)) alors (0.5)
(0.5)
aff_suiv(L, InsLLC(suivant(L), y))
retourner (L)
sinon retourner
retourner (L) (0.25)
(0.25)
Fin
3. En utilisant les fonctions précédentes, écrire la procédure « Insérer (var ID : index, y :chaine de
caractère) » qui permet d’insérer un nouveau mot « y » dans l’index « ID ». S’il n’existe pas déjà des
mots de même longueur que « y », une nouvelle case est insérée dans le tableau Tab.
INDICATION.
INDICATION Vous pouvez utiliser les fonctions suivantes :
a. Longch(ch : chaine de caractère) : entier qui retourne le nombre de caractère dans ch.
b. Cmpch (ch1, ch2 : chaine de caractère) : entier qui compare les chaînes ch1 et ch2 et retourne une valeur
négative si (lexicalement) ch1 < ch2, nulle si ch1 = ch2 et positive si ch1 > ch2.
procédure Insérer (var ID : index, y :chaine de caractère)
1 (0.25)
(0.25):
5): i RechSeqTab(ID.Tab,Longch(y), ID.Queue+1) // ou bien RechSeqTab(ID.Tab, 0,Longch(y),
ID.Queue+1)
2 (0.25)
(0.25):
5): Si (i <=ID.Queue) et (longch(y)
(longch(y) = ID.Tab[i].long)
ID.Tab[i].long) alors // s’il existe déjà des mots de même
longueur que y
//insérer dans la liste
3 : (0.25)ID.Tab[i].Tete
(0.25)ID.Tab[i].Tete InsLLC(ID.Tab(i].Tete, y)
Sinon // y est le premier mot de la liste
4 : (0.2
(0.25) Pour j ID.Queue à i pas -1 faire //décalage à droite
ID.Tab[j+1] ID.Tab[j]
//insérer une nouvelle case dans le tableau
5 : (0.25) ID.Tab[i].long longch(y)
6: (0.25)
(0.25) ID.Tab[i].Tete InsLLC(Nil, y)
7: (0.25)
(0.25) ID.queue ++
7/7