Vous êtes sur la page 1sur 40

Algorithmique et structures de donnes II

Premire
partie

Sries des exercices

Page 1

Algorithmique et structures de donnes II

Srie1 : Les pointeurs

Exercice1:
Analyser le programme suivant:
void main()
{
int a[10], *pa, x;
a[0] = 11; a[1] =22; a[2] = 33; a[3] = 44;
pa = &a[0];
x = *pa;
pa++;
x = *pa;
x = *pa + 1;
x = *(pa + 1);
x = *++pa;
x = ++*pa;
x = *pa++;
}

Exercice2:
Interprter les instructions suivantes:
char *pc;
int *pi,*pj,*pk;
float *pr;
pc = (char*)malloc(10);
pi = (int*)malloc(16);
pr = (float*)malloc(24);
pj = (int*)malloc(sizeof(int));

Page 2

Algorithmique et structures de donnes II


pk = (int*)malloc(3*sizeof(int));
free(pi);
free(pr);
Exercice 3:
adr1 et adr2 sont des pointeurs pointant sur des rels. Le contenu de adr1 vaut -45,78; le contenu de
adr2 vaut 678,89. Ecrire un programme qui affiche les valeurs de adr1, adr2 et leur contenu.
Exercice 4:
Saisir un texte. Ranger les caractres en mmoire. Lire le contenu de la mmoire et y compter le
nombre d'espaces et de lettres e.
Exercice 5 :
crire une fonction int* concat_tab(int t1[], int n1, int t2[], int n2) qui prend en paramtres deux
tableaux et leurs tailles respectives, et qui renvoie leur concatnation. Il faudra allouer un nouveau
tableau pour contenir cette concatnation.
Exercice 6 :
crire une fonction char* concat_string(char* s1, char* s2) qui prend en arguments deux chanes de
caractres et qui renvoie leur concatnation (il faut allouer un nouveau tableau pour la contenir).

Exercice 7 :
On se donne une structure livre :
typedef struct livre {
char titre[20];
int cote;
int prix;
} Livre;
On veut crer une bibliothque de plusieurs livres, sous la forme dun tableau de livres.
1) crire une fonction init qui renvoie un tableau de n livres, qui alloue la mmoire ncessaire et qui
initialise les champs 0 ou la chane de caractres vide.
2) crire une fonction qui permet la saisie dun livre.
2) crire une fonction qui affiche un tableau de n livres.
4) crire une fonction qui fait lchange des livres dindice i et j dans le tableau de livres.

Page 3

Algorithmique et structures de donnes II

Srie 2: La rcursivit

Exercice 1 :
crire une fonction rcursive qui permet de calculer la factorielle d'un entier positif.

Exercice 2 :
crire une fonction rcursive qui permet de calculer la somme des n (n 0) premiers termes ( partir
de 1 jusqu n).

Exercice 3 :
crire une fonction rcursive qui permet de calculer les nombres de "Fibonacci" qui sont dfinis par :
Fibonacci (0) = 0,
Fibonacci (1) = 1,
et pour tout n > 1, Fibonacci (n) = Fibonacci (n-1) + Fibonacci (n-2)

Exercice 4 :
crire une fonction rcursive qui permet de calculer le plus grand diviseur commun de deux entiers
naturels strictement positifs.

Exercice 5 :
crire une fonction rcursive qui permet de calculer la valeur de la fonction dAckermann dfinie de la
manire suivante pour m 0 et n 0 :

Acker(m, n) = Acker(m-1, Acker(m, n-1))


Acker(0, n) = n+1 pour n > 0
Acker(m, 0) = Acker(m-1, 1) pour m > 0

Page 4

Algorithmique et structures de donnes II

Exercice 6 :
Il sagit de calculer la somme des entiers allant de 0 un entier donn N et qui ont la mme parit
que N. Par exemple,
Pour la valeur 6, la fonction doit rendre la valeur 12. (6+4+2+0 = 12)
Pour la valeur 5, la fonction doit rendre la valeur 9. (5+3+1 = 9)
a) crire une fonction itrative permettant de rsoudre ce problme.
b) Rsoudre le mme problme par une fonction rcursive.

Exercice 7 :

Ecrire une fonction rcursive qui teste si un nombre positif n est un multiple de 5.
Exercice 8
On souhaite crire une fonction calculant la division par 2 d'un entier sans utiliser l'oprateur / mais
seulement les oprateurs + et -. Pour cela on remarque la proprit suivante :

Ecrire cette fonction dune manire rcursive.


Exercice 9
On souhaite crire une fonction calculant le produit de deux entiers m et n sans utiliser l'oprateur *
mais seulement les oprateurs + et -.
Pour cela on remarque la proprit suivante :

Ecrire cette fonction dune manire rcursive.

Page 5

Algorithmique et structures de donnes II


Exercice 10
Ecrire une fonction rcursive qui retourne Cnp, le nombre de combinaisons de p lments d'un
ensemble comportant n lments. Une dfinition rcursive de Cnp est donne par :
pour les cas de base et par :

pour le cas de rcurrence :


Cnp = Cn-1p-1 + Cn-1p

Exercice 11 :
crire une fonction rcursive qui permet de dire si un mot donn est un palindrome ou pas.

Exercice 12 :

crire une fonction rcursive qui retourne la valeur numrique dune sous chane de taille nbr dune
chane de caractres compose de chiffres. (Exemple : a = valeurNumerique("5123",3) a =512)
Exercice 13 :
crire une fonction rcursive qui compte le nombre doccurrences dun entier dans un tableau dentiers.

Exercice 14 :
crire une fonction rcursive qui permet dinverser un tableau dentiers

Page 6

Algorithmique et structures de donnes II

Srie 3: Les Listes

Exercice 1 : Ecrire le code de fichier ELTDBL.H qui permet de dclarer le type double comme
structure de donnes adopte.
a) Ecrire le code de fichier ELSDD.H qui permet de choisir le type double comme structure de
donnes.
b) Ecrire le code de fichier ELTDBL.C qui permet de dfinir les primitives pour une ralisation
par des doubles de TDA ELEMENT.
c) Ecrire une fonction qui renvoie la position de la premire occurrence dun lment dans une
liste de doubles. Cette fonction renvoie 0 si llment est inexistant.
d) Ecrire une fonction qui renvoie la moyenne de valeurs dune liste de doubles.
e) Ecrire une fonction qui permet de trier une liste de doubles en ordre croissant.
Exercice 2 :
a) Ecrire le code de fichier ELTSTR.H qui permet de dclarer le type string (chaine de
caractres) comme structure de donnes adopte.
b) Ecrire le code de fichier ELSDD.H qui permet de choisir le type string comme structure de
donnes.
c) Ecrire le code de fichier ELTSTR.C qui permet de dfinir les primitives pour une ralisation
par des strings de TDA ELEMENT.
d) Ecrire un programme qui lit des chanes de caractres sur l'entre standard. A la rencontre de
la chane "la", il affichera la liste des chanes dj saisies. A la rencontre de la chane "li", il
affichera cette liste dans l'ordre inverse.
Exercice 3 :
criture d'un programme interactif de gestion des tudiants. Ce programme affichera le menu suivant :
1 Ajout dun tudiant.
2 Recherche dun tudiant.
3 Suppression dun tudiant.
4 Tri de liste des tudiants.
5 Affichage de liste des tudiants.
Page 7

Algorithmique et structures de donnes II


6 Vider la liste.
7 Quitter.
En outre, ce programme effectuera le traitement correspondant au choix effectu. Les tudiants seront
sauvegards dans une liste (sauvegarde indirect). Un tudiant est reprsent par la structure
suivante :
typedef struct {
char nom[50] ; /* nom et prnom dun tudiant */
char adr[80] ; /* adresse dun tudiant */
int insc ; /* numro dinscription */
} ETUDIANT ;
a) Ecrire le code de fichier ELTETD.H qui permet de dclarer le type ETUDIANT comme structure de
donne adopte.
b) Ecrire le code de fichier ELSDD.H qui permet de choisir le type ETUDIANT comme structure de
donne.
c) Ecrire le code de fichier ELTETD.C qui permet de dfinir les primitives pour une ralisation par
des ETUDIANTS de TDA ELEMENT.
d) Ajouter les fonctions ncessaires et crire le programme principal correspondant.
Exercice 4 :
a) Ecrire une fonction qui permet de vrifier lexistence dun lment dans une liste non trie
(recherche squentiel).
b) Ecrire une fonction qui permet de purger une liste (supprimer les doublons).
c) Ecrire une fonction qui permet de trier une liste en ordre dcroissant.
d) Ecrire une fonction qui permet de rechercher un lment dans une liste trie en ordre croissant
(recherche dichotomique).
e) Ecrire une fonction qui permet dinverser une liste.
f) Ecrire une fonction qui permet de concatner deux listes (sans doublons).
g) Ecrire une fonction qui permet de renvoyer lintersection de deux listes.
h) Ecrire une fonction qui permet de fusionner deux listes tries en ordre croissant. La liste rsultante
doit tre trie.

Page 8

Algorithmique et structures de donnes II

Srie 4 : Les listes chaines

Exercice 1 :
On suppose quon dispose des fichiers ELTDBL.H et ELTDBL.C implments dans lexercice 1 de la srie
3.
Dans cet exercice, on sintresse traiter une liste simplement chane de rels.

1) Ecrire une fonction MinMax qui permet de calculer le min et le max dans une liste chane de rels.
2) Ecrire une fonction MoyProd qui permet de calculer la moyenne et le produit dune liste chane de
rels.
3) Ecrire une fonction qui permet dinverser une liste de rels.
4) Ecrire une fonction qui permet de fusionner deux chanes de rels une position donne.

Exercice 2 :
Un livre est caractris par :
1) son numro (entier)
2) son titre (chane de caractre)
3) son auteur (chane de caractre)
4) son diteur (chane de caractre)
5) son prix (rel)

1) Ecrire le fichier ELTLVR.H qui dfinit un livre comme tant une implmentation du TDA ELEMENT,
sachant quon veut stocker les livres indirectement.
2) Ecrire le fichier ELTLVR.C
3) Ecrire une fonction qui permet de retourner le nombre dexemplaires dun livre donn.
4) Ecrire une fonction qui permet de calculer le nombre de livres dun diteur donn.
5) Ecrire une fonction qui permet de retourner un tableau de livre dun auteur donn.
6) Ecrire une fonction qui retourne le livre le plus cher.
7) Ecrire une fonction qui permet de calculer la valeur de la bibliothque (somme des prix des
livres).

Page 9

Algorithmique et structures de donnes II


8) Ecrire une fonction qui permet de retourner une partie de la liste de livres partir dune
position Deb une position Fin.

Exercice 3 :
Un abonn est caractris par :
- son numro
- son nom
- sa ville
1) Ecrire le fichier ELTABN.H qui dfinit un abonn comme tant une implmentation du TDA ELEMENT,
sachant quon veut stocker les abonns indirectement.
2) Ecrire le fichier ELTABN.C
3) Ecrire une fonction qui permet de vrifier sil existe dans la liste un abonn dont le nom est N et la
ville est V.
4) Ecrire une fonction qui permet de calculer le nombre dabonns dune ville donne.
5) Ecrire une fonction qui permet de retourner un tableau des villes distinctes des abonns.
6) Ecrire une fonction qui retourne un tableau dabonn dune ville donne.

Page 10

Algorithmique et structures de donnes II

Srie5: Les expressions arithmtiques (pile et file)

Exercice1:
1) Excuter manuellement lvaluation ds expressions postfixes suivantes :
a) 6 5 2 3 + 8 * + 3 + *
b) 6 3 2 - 1 + / 9 6 - *

2) Excuter manuellement la transformation de cette expression infixe a+b*c+(d*e+f)*g


en expression postfixe.

Exercice 2:

On veut crire un programme permettant dvaluer un expression postfixe utilisant comme


oprateurs uniquement les oprateurs binaires +, - , * et / et manipulant uniquement des chiffres (les
nombres sont des chiffres 0, 1, 2, .9), autrement dit un entier est un seul chiffre.
On suppose que lexpression est donne sans qu il y ait des sparateurs (pas despaces entre les
oprateurs et les valeurs).
Par exemple : 36*25+- (qui est lquivalent en infixe (3*6)(2+5))
Ecrire le programme correspondant lvaluation de ce type dexpression postfixe

Exercice 3:
En reprenant les mme hypothses que lexercice prcdent, crire le programme correspondant
lvaluation dune expression prfixe (exemple -*36+25)

Exercice 4:

Page 11

Algorithmique et structures de donnes II


On veut gnraliser lvaluation des expressions arithmtiques postfixes (par rapport lexercice 2).
- Les oprateurs utilises sont les oprateurs binaires +, -, * et /
- Les entiers manipuls peuvent tre composes de plus quun chiffre (ex : 345, 89, etc).
- Il est impratif qu il y ait un espace (sparateur) entre deux entiers ou deux oprateurs ou un entier
et un oprateur.
Par exemple : 3 6* 2 5 + - (qui est lquivalent en infixe de (3*6) (2 + 5))
99 65 + 567 7 + * (qui est lquivalent en infixe de (99 + 65) * (567 + 7))

Ecrire le programme correspondant lvaluation de ce type dexpression postfixe.

Exercice 5:
En se basant sur les hypothses de lexercice prcdent, crire un programme permettant d
transformer une expression infixe en une expression infixe

Rappelons qu il faut quil y ait toujours un sparateur (espace) entre les entiers, les oprateurs et aussi
les parenthses ( et ).

Page 12

Algorithmique et structures de donnes II

Srie 6 : Les Arbres

Exercice 1
a) Ecrire une fonction ARBIN creerArbreEntiers() qui permet de crer et de renvoyer
larbre dentiers suivant :
b) Ecrire une fonction int feuilles(ARBIN a) qui permet de compter le nombre de
feuilles dun arbre.
c) Ecrire une fonction void inverserArbre(ARBIN a) qui permet dinverser un arbre
dentiers (fils gauche devient fils droit et vice versa).

Exercice 2
Procdure FileArbre (A : ArbreBinaire)
F : File de noeuds dun arbre binaire
P : Noeud dun arbre binaire
Dbut
Initialiser(F) // Cration dune file vide
Enfiler(F, A->refRacine)
Tantque NonVide(F) Faire
P<-Dfiler(F)
Afficher(P->Info)
Si P->FG != NULL Alors Enfiler(F, P->FG) Finsi
Si P->FD != NULL Alors Enfiler(F, P->FD) Finsi
Fin Tantque
Fin
En utilisant la procdure FileArbre, donner l'ordre d'affichage des noeuds de l'arbre ci-dessous

Page 13

Algorithmique et structures de donnes II

Exercice 3
Dans cet exercice, on se propose de traiter des arbres binaires partiellement quilibrs en utilisant le
type
arbre binaire ARBIN. Un arbre binaire est dit partiellement quilibr sil est vide ou si pour chaque
noeud de
larbre les hauteurs de ses sous arbres gauches et droits diffrent de au plus 1.
a) En utilisant les primitives dun arbre binaire (ARBIN), crire une fonctions rcursive int
equilibre(ARBIN a)
qui retourne 1 (vrai) si larbre a satisfait la dfinition dun arbre binaire partiellement quilibr et 0
(faux)
sinon.
Soit un arbre binaire a manipulant des lments nomms CarHauteur. Un lment CarHauteur est
dclar
dans le fichier ELTCARHAUT.H comme suit :
typedef struct {
char car ;
int hauteur ;
} CarHauteur, * ELEMENT ;
b) Ecrire une fonctions rcursive void calculerHauteurs(ARBIN a) qui prend en argument un arbre
binaire de
ce type. Cette fonction modifie larbre en entre en mettant jour le champ hauteur de chaque noeud
de
faon ce quil contienne la hauteur du sous arbre dont il est la racine.

Page 14

Algorithmique et structures de donnes II

c) En employant la fonction calculerHauteurs, donner une nouvelle implmentation de fonction equilbre


(question a)
Exercice 4
Soit le type arbre pine dorsale qui est un arbre ternaire structur de la manire suivante :

a) Remplir les blancs relatifs la figure ci-dessus :


- La profondeur de cet arbre est ..
- Lordre de cet arbre est..
- Le rsultat du parcours postfix est..
- La liste A,B,Z,X,C,E,Y,D,R,M,F,N est un le rsultat du
parcours..
- Les noeuds B, Z, X appartiennent au niveau ..
- A-Z-E-R est ..
Limplmentation chane de la structure de donnes pine dorsale va se faire dans les fichiers
ARBED.H et ARBED.C.
b) Ecrire le code de fichier ARBED.H qui permet de dclarer le type arbre pine dorsale.
c) Ecrire une fonction itrative int tailleED(ARBED a) qui permet de renvoyer la taille dun arbre pine
dorsale.
d) Ecrire une fonction itrative int verifierED(ARBED a) qui permet de renvoyer 1 (vrai) si larbre a est
pine dorsale et 0 si non (faux).
Exercice 5
On dfinit un tas comme tant un arbre binaire parfait tel que linformation contenue dans chaque
noeud est infrieure celles contenues dans ses deux fils. Le minimum de lensemble reprsent par un
tas est donc la racine (Cest le cas de lexemple ci-dessous).
Les traitements sur les tas ncessitent que chaque noeud puisse accder son pre ainsi qu ses fils.

Page 15

Algorithmique et structures de donnes II

On se propose dimplmenter les primitives de structure de donnes TAS suivants :


- int tasInserer(TAS t, ELEMENT e) ;
- ELEMENT supprimerMin(TAS t) ;
- ELEMENT tasRacine(TAS t) ;
- int tasVide(TAS t) ;
- int tasSature(TAS t) ;
- etc
a) Ecrire le code de fichier TASPTR.H qui permet dimplmenter le tas dune faon chane.
Un arbre binaire parfait de taille n peut se reprsenter de faon trs compacte dans un tableau T de
taille au
moins gale n + 1 (la premire cellule de T, de rang 0, nest pas utilise). La reprsentation est la
suivante: La racine est en T[1] et si un noeud est en T[i], son fils gauche est en T[2i] et son fils droit en
T[2i+1].
b) Donner la reprsentation dans le cas de larbre ci-dessus.
c) Quel est linstruction qui permet de rcuprer le pre dun noeud i.
d) Pourquoi cette reprsentation contigu est-elle adquate avec les Tas.
e) Ecrire le code de fichier TASTAB.H qui permet dimplmenter le tas dune faon contigu.
Insertion dun lment un tas
Le problme est dajouter un lment e un tas tout en conservant une structure de tas. On commence
par

Page 16

Algorithmique et structures de donnes II


rajouter llment e comme feuille au dernier niveau de larbre puis on change linformation du nud
portant e avec celui de son pre jusqu ce que, pour respecter la structure de tas, e ne soit pas
infrieur
linformation du pre du noeud qui le porte. Par exemple, pour rajouter 4 au tas donn dans
lexemple ci-dessus, on obtient les tapes suivantes :

f) Ecrire une fonction itrative int tasInserer(TAS t, ELEMENT e) qui permet dinsrer un lment e un
tas t.
En supposant que la fonction NOEUDTAS dernierPere(TAS t) qui retourne le pre de e est donne.
Dans
lexemple prcdant la fonction dernierPere() retourne le noeud contenant 8. La complexit
temporelle de
cette fonction est de O(N), N tant la taille de larbre.
g) Donner la complexit temporelle de cet algorithme avec une brve explication.
Suppression du minimum dun tas (la racine)
h) Ecrire une fonction itrative ELEMENT supprimerMin(TAS t) qui permet de supprimer le minimum du
tas
courant et retournant la valeur de ce minimum, en utilisant la reprsentation contigu. Lide est de
supprimer la dernire feuille du dernier niveau aprs avoir recopi son information la racine, puis,
pour respecter la structure de tas, de faire redescendre cette valeur en la comparant au contenu de
ses fils, par un processus inverse de celui de linsertion. La figure suivante illustre ce processus dans le
cas de lexemple.

Page 17

Algorithmique et structures de donnes II

Exercice 6 (Session Principale 2007/2008)


Un arbre lexicographique est un arbre binaire qui reprsente un dictionnaire tel que:
- Chaque noeud contient un caractre
- Le fils droit signifie le caractre suivant dans le mot.
- Le fils gauche signifie le caractre suivant dans le dictionnaire (alternative). Le caractre * signifie
la
fin dun mot. Il est noter qu'un noeud "fin de mot" n'a pas de sousarbre droit mais peut avoir un sous
arbre gauche. Par exemple, l'arbre suivant correspond aux 8 mots :
a
bac
balle
ballon
bas
base
bus
sac

Page 18

Algorithmique et structures de donnes II

La structure arbre lexicographique peut tre implmente par un arbre binaire dont les lments sont
de caractres (ELTCAR.H et ELTCAR.C).
a) Donner la trace dexcution de la fonction f suivante :
public void f (ARBIN a) {
char mot[20] ;
g (a->refRacine, mot,0);
}
void g (NOEUD n, char m[], int i) {
if (n != NULL) {
if (n->info == *) {
m[i] = \0;
printf(%s, m);
} else {
m[i] = n->info;
g (n->fd, m, i + 1);
}
g (n->fg, m, i);
}

Page 19

Algorithmique et structures de donnes II


}
Quelle est lutilit de cette fonction ?
b) Ecrire une fonction rcursive int existeRec(ARBIN a, char mot[]) qui permet de tester lexistence dun
mot
dans un arbre lexicographique.
c) Ecrire une fonction itrative int existeIt(ARBIN a, char mot[]) qui permet de tester lexistence dun mot
dans un arbre lexicographique.

Page 20

Algorithmique et structures de donnes II

Deuxime
partie

Devoirs surveills

Page 21

Algorithmique et structures de donnes II

Devoir surveill n 1 (2009-2010)


On propose dcrire un programme permettant de reprsenter les polynmes. Un polynme est un
ensemble de monmes. Un monme est compos de deux entiers :
coefficient
puissance

Linterface de ce type est la suivante (fichier POLYPRIM.H)


POLYNOME PolynomeCreer() ;
int PolynomeTaille(POLYNOME) ;
int estVide(POLYNOME) ;
int estSaturee(POLYNOME) ;
POLYNOME SaisiePolynome(int) ;
Void Reduction(POLYNOME) ;
On se propose dimplmenter quelques primitives de cette interface sous la forme dune liste chane
de monmes (fichiers POLYPTR.H pour les dclarations des structures et POLYPTR.C pour le code).
La figure ci-contre est une reprsentation du polynme :
1) Ecrire le fichier POLYPTR.H qui dfinit les structures ncessaires. (3 points)

typedef struct structNoeud {


int coefficient;
int puissance ;
struct structNoeud * suivant;
} structNoeud, * NOEUD;
typedef struct {
NOEUD tete;
int lg;

Page 22

Algorithmique et structures de donnes II


} laStruct,*POLYNOME;
Sinon ils peuvent utiliser le type ELEMENT qui correspond une structure contenant les deux int.

2) En se limitant aux fonctionnalits de linterface POLYPRIM.H implmenter la fonction POLYNOME


SaisiePolynome(int n) qui permet de saisir un polynme de n monmes. (5 points)
POLYNOME SaisiePolynome(int n)
{
NOEUD p,q;
POLYNOME L=PolynomeCreer();
if(L==NULL)
return L ;
if(n>=1)
{
p=noeudCreer();
scanf(`` %i ``, &p->puissance) ;
scanf(`` %i ``, &p->coefficient) ;
L->tete=p;
p->suivant=NULL;
L->lg++;
for(int i=1;i<n;i++)
{
q=noeudCreer();
scanf(`` %i ``, &q->puissance) ;
scanf(`` %i ``, &q->coefficient) ;
p->suivant=q;
p=q;
L->lg++;
}
p->suivant=NULL;
}
return L;
}

Page 23

Algorithmique et structures de donnes II

3) En se limitant aux fonctionnalits de linterface POLYPRIM.H implmenter la fonction void


Reduction(POLYNOME P) qui permet de rduire la taille du polynme P en effectuant la somme des
monmes ayant la mme puissance. (6 points)
En appliquant cette fonction lexemple prcdent, on obtiendra

void Reduction(POLYNOME P)
{
NOEUD p=L->tete,q,s;
int i=1;
while (p!=NULL)
{
s=p;
q=p->suivant;
while(q!=NULL)
{
if((q->puissance == (p->puissance)
{
p->coefficient+=q-> coefficient;
s->suivant=q->suivant;
noeudDetruire(q) ;
L->lg--;
q=s->suivant ;
}
else
{ q=q->suivant;

Page 24

Algorithmique et structures de donnes II


s=s->suivant;
}
}
p=p->suivant;
}
}

4) Donner la complexit de chaque fonction implmente et argumenter votre rponse. (4 points)

Complexit fonction : POLYNOME SaisiePolynome (int n)


O(n)
Complexit fonction : Void Reduction( POLYNOME P)
n+(n-1)+(n-2)++1= (n-n)/2 ==O(n)

5)Quels sont les modifications ncessaires pour avoir une liste chaine circulaire de monmes. (2 points)
Si quelquun a compris lide que pour une liste circulaire chaine la queue doit pointer sur la tte, il
peut avoir les 2 pts du barme.

Page 25

Algorithmique et structures de donnes II

Devoir surveill n 2 (2010-2011)


Exercice 1: Dfinition dun type de donne MATRICE (12 points)

On veut dfinir un nouveau type abstrait : MATRICE sans avoir recours au TDA LISTE
On suppose quon dispose des fichiers ELTINT.H et ELTINT.C implments qui permettent de raliser le
TDA ELEMENT par un entier et du fichier MATPRIM.H qui dfinit les primitives du TDA MATRICE.
Les oprations de base sont : la cration dune matrice, lajout et la suppression dune ligne ou dune
colonne et laccs un lment de la matrice.
MATRICE CreeMatrice();
Int InsererLigne(MATRICE,int)
Int InsererColonne(MATRICE,int)
Int SupprimerLigne(MATRICE,int)
Int SupprimerColonne(MATRICE,int)
Element Rcuperer(MATRICE , Int, int)
1. Ecrire le fichier MATPTR.H qui dfinit une matrice simplement chaine comme tant une
implmentation du TDA MATRICE (Il vous faudra galement dfinir NOEUD) (3 points)

Page 26

Algorithmique et structures de donnes II


#ifndef _MATPTR_H
#define _MATPTR_H
#include "ELTPRIM.h"
typedef struct structNoeud {
ELEMENT info;
struct structNoeud * suivant_ligne;
struct structNoeud * suivant_colonne;
} structNoeud, * NOEUD;
typedef struct {
NOEUD tete;
int NL;
int NC;
} laStruct,*MATRICE;
#endif

ime

2)Ecrire une fonction int Supprimer (MATRICE M, int k) qui permet de supprimer la k ligne de la
matrice. Cette fonction retourne 1 si lopration de suppression a t effectue avec suces, 0 sinon. (9
points)
supprimer (MATRICE M, int k )
{
int i, succee=1;
NOEUD p, q,n;
if (estVide(M))
{
printf ("\nMatrice vide");
succee=0;
}
else
{
if ((k < 1) || (k> M->NL))
{
printf ("\nPosition invalide");
succee=0;
}

Page 27

Algorithmique et structures de donnes II


else
{
q = M->tete;
if (k == 1) /*suppression de la premire ligne*/
{
M->tete=M->tete->suivant_ligne;
for(i=1;i<=L->NC; i++)
{
p=q;
q=q->suivant_colonne;
noeudDetruire(p);
}
}
else /*cas gnral (k > 1) */
{
for (i=1; i<k; i++)
{
p = q;
q = q->suivant_ligne;
}
for(i=1;i<=L->NC; i++)
{
p->suivant_ligne=q->suivant_ligne;
p=p->suivant_colonne ;
n=q ;
q=q->suivant_colonne ;
noeudDetruire(n);
}
}
(L->NL)--;
}
}
return succee;
}

Page 28

Algorithmique et structures de donnes II

Exercice 2 : expression bien parenthse (8 points)


En utilisant la structure pile contige, Ecrire une fonction qui vrifie si une expression est bien
parenthse. Nous considrerons des expressions arithmtiques, formes de nombres entiers et des
quatre oprateurs. Ces expressions pourront tre parenthse laide de deux types de parenthses
diffrentes : () et [].
Une expression est dite bien parenthse si pour toute parenthse fermante dun certain type, il existe
une parenthse ouvrante du mme type qui la prcde, et qui na pas encore t ferme.
NB : vous pouvez utiliser les primitives de piles.
Exemple :
Les expressions suivantes sont bien parenthses :
([3 + 5] (2 9))
1+4
([(2)])
Les expressions suivantes ne sont pas bien parenthses :
(3 + 5] : les types de parenthses ne correspondent pas.
((3) : une des deux parenthses na pas t ferme.
(4)) : on ferme une parenthse qui na pas t ouverte.
int VerifPar(char* ch )
{
int i = 1, n=strlen(ch); int res;
Pile P = PileCreer();
for (i=0; i <n; i++)
{
if (ch[i] == ( ||ch[i] == [ )
Empiler(P, ch[i]) ;
else
{
if (ch[i]= =) )
if (EstVide(P) || Sommet(P) == [ ) res=0; ;
else
Depiler(P) ;
}
else
if (ch[i]= =] )
if (EstVide(P) || sommet(P) == ( ) res= 0 ;
else
Depiler(P) ;
}
if (EstVide(P) ) res= 1 ;
else res= 0 ;
PileDetruire(P);

Page 29

Algorithmique et structures de donnes II


Return res;
}

Page 30

Algorithmique et structures de donnes II

Devoir surveill n 3 (2012-2013)


On se propose de dfinir la structure Dictionnaire permettant davoir une liste de mots avec leurs
dfinitions. Pour cela on procdera comme suit :
La structure Mot est dfini par :

Une chane (chane de caractres),


ses explications (tableau de chane de caractres),
et le nombre dexplications de cette chane.

La structure Dictionnaire est dfinie par une liste doublement chane de dfinitions.

1. Ecrire le code du fichier ELTMOT.H qui permet de raliser le TDA ELEMENT pour une structure
MOT (en stockage indirect).
2. Ecrire le code du fichier ELTMOT.C qui permet de dfinir les primitives de TDA ELEMENT.
3. Ecrire une fonction InsererDef qui permet d'ajouter une explication pour un mot donn dans le
dictionnaire sil existe.
4. Ecrire une procdure DefinitionMOT qui donne le nombre et les explications dune chane
donne.

Corrig du devoir surveill n 3 (2012-2013)

1.

2 pts
#ifndef _ELTMOT_H
#define _ELTMOT_H
typedef struct{
char chaine [100];
char explications [100][100];
int nbre;
}mot, *ELEMENT;
#endif

2.

8 pts

#include "ELTPRIM.h"
1 ELEMENT elementCreer(void)
{

ELEMENT e;
e=(ELEMENT)malloc(sizeof(mot));
return e;

Page 31

Algorithmique et structures de donnes II


0,5 void elementDetruire (ELEMENT e)
{

free (e);

2 void elementLire(ELEMENT * e)
{

int i;
printf("donner un mot:\n");
scanf("%s",&(*e)->chaine);
do{

printf("donner le nombre d'explications de ce mot:\n");


scanf("%d", &(*e)->nbre);

}while((*e)->nbre<=0);
for(i=0; i<(*e)->nbre; i++)
{

printf("donner l'explication N %d:",i+1);


scanf("%s", &((*e)->explications[i]));
printf("\n");

}
1,5 void elementAfficher(ELEMENT e)
{

int i;
printf("le mot est: %s\n", e->chaine);
printf("les definitions donnees pour ce mot sont:\n");
for(i=0; i<e->nbre; i++)
printf("explication N %d: %s \n", i+1, e->explications[i]);

}
0,5 void elementAffecter(ELEMENT * e1, ELEMENT e2)
{

*e1=e2;

2 void elementCopier(ELEMENT * e1, ELEMENT e2)


{

int i;
strcpy((*e1)->chaine, e2->chaine);
(*e1)->nbre=e2->nbre;
for(i=0; i<(*e1)->nbre; i++)
strcpy((*e1)->explications[i], e2->explications[i]);

}
0,5 int elementComparer(ELEMENT e1, ELEMENT e2)

Page 32

Algorithmique et structures de donnes II


{ return strcmp(e1->chaine,e1->chaine);
3.

5 pts

#include "LSTPRIM.h"
int InsererDef(LISTE l, ELEMENT e, char expli [])
{

int taille, trouve=0;


NOEUD p=l->tete;
if (estVide(l))
{

printf("liste vide\n");
return 0;

}
else
{

while(!trouve && p!=NULL)


{

if (elementComparer(p->info, e) == 0)
{

taille=p->info->nbre;
strcpy(p->info->explications[taille],expli);
p->info->nbre++;
trouve=1;

}
else
p=p->suivant;
}
}
return trouve;
}
4.

5 pts

void DefinitionMOT(LISTE l, char chaine[], char res[100][100], int * nb)


{

int i;
NOEUD p=l->tete;
int trouve=0;
if (estVide(l))
printf("liste vide\n");
else
{

while(!trouve && p!=NULL)


{

if (strcmp(p->info->chaine, chaine) == 0)
{

for(i=0; i<p->info->nbre; i++)

Page 33

Algorithmique et structures de donnes II


strcpy(res[i], p->info->explications[i]);
trouve=1;
*(nb)=p->info->nbre;
}
else
p=p->suivant;
}
}}

Page 34

Algorithmique et structures de donnes II

Troisime
partie

Sujets Des Examens

Page 35

Algorithmique et structures de donnes II

Examen corrig N1 (2009/2010)

Exercice 1 (12 points) :


Un arbre dexpressions est un arbre binaire o les noeuds sont ou bien des oprateurs ou bien des
oprandes:
1) En supposant quon dispose dun arbre dexpressions non vide, crire la fonction ABRFile(ARBIN a ,
int O, FILE F) qui permet de parcourir un arbre a de telle sorte crer lexpression arithmtique qui
lui correspond sous forme dune FILE F. La nature de lexpression demande est prcis par lentier O
(O=1: expression prfixe, O=2: expression infixe, O=3: expression postfixe). Comme le montre
lexemple suivant:

Remarque : Vous pouvez utiliser toutes les fonctionnalits du TDA File, par contre pour les arbres seule
la structure peut tre utilise (toute autre fonctionnalit doit tre programme).
void ABRFile(ARBIN a, int O, FILE F) {
AjouterNoeud (a->refRacine, F, O);
}
===================================
void AjouterNoeud(NOEUD n, FILE F, int O)
{

Page 36

Algorithmique et structures de donnes II


if(n)
{
switch(O)
{
case 1: /* parcours prfix */
Enfiler (F, n->info) ;
AjouterNoeud (n->fg, F, O);
AjouterNoeud (n->fd, F, O);
break;
case 2: /* parcours infix */
AjouterNoeud (n->fg, F, O);
Enfiler (F, n->info) ;
AjouterNoeud (n->fd, F, O);
break;
case 3: /* parcours postfix */
AjouterNoeud (n->fg, F, O);
AjouterNoeud (n->fd, F, O);
Enfiler (F, n->info) ;
break;
default:
printf("Erreur d'affichage: ordre %d incorrect.\n", ordre);
}
}
}

2) Afin dvaluer lexpression arithmtique obtenue dans F, quelle est la (ou les meilleurs) valeur de O
quil faut choisir. Justifier votre rponse
Les expressions prfixes et postfixes ont lavantage que lordre de priorit est dtermin par leur
position dans ces expressions.
Les expressions prfixes et postfixes peuvent tre facilement values en utilisant les piles.

Page 37

Algorithmique et structures de donnes II

3) Supposons que O=1, donner les diffrentes tapes qui permettent dvaluer
F= * + 5 6 - -4 9 en utilisant une pile P ( chaque tape prciser le contenu de P et celui de F)

Exercice 2 (8 points):

Page 38

Algorithmique et structures de donnes II


Soit P = (a1, . . . , an) une pile non vide de n lments (avec a1 le sommet de la pile). On dsire
modifier le contenu de la pile P pour qu'elle contienne (a2, . . . , an, a1) (c'est--dire le sommet a1 est
dplac au fond de la mme pile). Cette opration sappelle la rotation dune pile. On considrera
l'implmentation chaine suivante de la pile
typedef struct structNoeud {
ELEMENT info;
struct structNoeud * suivant;
} structNoeud, * NOEUD;
typedef struct {
NOEUD tete; /* Sommet de la pile */
} laStruct,*Pile;
1) Donner une implmentation en langage C de la fonction Rotation (Pile P), sans utiliser les primitives
du TDA Pile.
void Rotation(Pile P) {
NOEUD n, m;
If (P->tete != null) && (P->tete->suivant != null)
{
n = P->tete; P->tete = P->tete->suivant; m = P->tete;
while m->suivant !=null { m = m->suivant
}
m->suivant = n;
n->suivant = null;
}
}

2) Donner la complexit temporelle et spatiale d'un algorithme qui appelle la fonction rotation m fois
sur une pile qui contient n lments
Complexite temporelle O(nm) spatiale O(n)

Page 39

Algorithmique et structures de donnes II

Rfrences

http://www.montefiore.ulg.ac.be/~geurts/Cours/sda/2011/01-intro.pdf
R. Malgouyres, F. Feschet, Z. Zrour. Algorithmique et structures de donnes en C
2011.

Page 40

Vous aimerez peut-être aussi