Académique Documents
Professionnel Documents
Culture Documents
Exercice 1 : (5 pts).
On dispose d’un tableau T (liste contigüe) de taille N contenant des éléments entiers. On nous demande
d’inverser les éléments de T (sans utiliser un autre tableau).
1. Écrire une fonction itérative.
2. Écrire une fonction récursive ( ainsi que son premier appel ).
0 1 2 3 4 5
T: 5 8 1 9 12 4
0 1 2 3 4 5
après inversion T : 4 12 9 1 8 5
Exercice 2 : (8 pts).
val nxt
On souhaite créer deux sous-listes L1 et L2, tel que L1 contient les valeurs de la première moitié
de L, et L2 contient les valeurs restantes de l’autre moitié. La liste initiale L sera conservée et
l’ordre des éléments doit être respecté dans L1 et L2.
1. Écrire une fonction « moitié-1 » permettant de créer une liste chainée L1 dont les
éléments sont identiques à la première moitié de L.
2. Écrire une fonction « moitié-2 » permettant de créer une liste chainée L2 dont les
éléments sont identiques à la deuxième moitié de L.
3. Écrire une fonction « verif » permettant de vérifier que la liste initiale L est l’union de
L1 et L2.
L 7 2 8 5 1 ×
L1 7 2 8 ×
L2 5 1 ×
Page 1 / 2
Exercice 3 : (7 pts).
1. Implémenter un algorithme pour la recherche d’une clé (valeur) v dans un arbre binaire
de recherche b ; l’algorithme retourne 1 si v figure dans b et 0 sinon.
o Itérative.
o Récursive.
25 15 40 20 30 18 28
Examiner la propriété de l’équilibre après chaque ajout.
Page 2 / 2
Algorithmique - Corrigé
Exercice 1:
T[end] = temp; *m = c;
} }
} }
Créer une liste chainée L1 dont les éléments sont identiques à la première moitié de L.
Liste moitie1(Liste L)
{
Liste m ;
int Tl=taille(L), m1 ;
if (Tl%2==0) m1=Tl/2;
else m1=Tl/2 + 1;
if(m1==0) return NULL;
Liste L1=NULL,P,d;
m= (Liste) malloc(sizeof(cellule));
m->val = L->val;
L1= Ajouter_fin( L1,m);
L=L->nxt;
for(int i=1;i<m1;i++)
{
m= (Liste) malloc(sizeof(cellule));
m->val = L->val;
L1= Ajouter_fin( L1,m);
L=L->nxt;
}
return L1;
}
Écrire une fonction « moitié-2 » permettant de créer une liste chainée L2 dont les éléments
sont identiques à la deuxième moitié de L.
Liste moitie2(Liste L)
{
Liste m;
return L2;
}
Écrire une fonction « verif » permettant de vérifier que la liste initiale L est l’union de L1 et L2.
Fin
Version récursive
Algorithme Rechercher (ABR b, Valeur v) : retourne 1 ou 0
Début
Si (b=vide) Alors retourner 0
Sinon
Si (v = b.val) lors retourner 1
Sinon
Si (v < b.val) Alors retourner Rechercher ( b, v.fg)
Sinon retourner Rechercher ( b, v.fd)
Fsi
Fsi
Fsi
Fin
Construction AVL :
Annexe EXO1
#include<stdio.h>
Inverser_Tab1(Tab,start+1,end-1);
}
}
Inverser_Tab1(T,0,N-1);
printf("\n\tTableau Apres Inversion 1 : \n");
Afficher_Tab(T,N-1);
Inverser_Tab2(T,T,T+N-1);
printf("\n\tTableau Apres Inversion 2 : \n");
Afficher_Tab(T,N-1);
Inverser_Tab3(N,T);
printf("\n\tTableau Apres Inversion 3 : \n");
Afficher_Tab(T,N-1);
return 0;
}