Beruflich Dokumente
Kultur Dokumente
b) crire une fonction void echange_lvr(int i, int j, struct lvr * bib) qui fait lchange des livres dindice i et j
dans le tableau bib.
1
void echange_lvr(int i, int j, struct lvr * bib){
struct lvr tmp;
tmp = bib[i];
bib[i]=bib[j];
bib[j]=tmp;
}
Exercice 4 Pile
Une pile est une structure de donne dans laquelle on peut rentrer des lments, puis les ressortir dans lordre
inverse. Nous allons raliser une pile dentiers avec des tableaux. Une premire mthode consiste stocker tous
les entiers dans un tableau, et tout recopier dans un tableau plus grand dune case lorsque lon veut ajouter un
lment, et dans un tableau plus petit dune case lorsque lon veut enlever un lment. Par exemple, on travaille
avec la structure :
2
void empile ( int x , struct pil e_s impl e * p i l e ) { int d e p i l e ( struct pi l e_s impl e * p i l e ) {
int * t ; int * t ;
int i ; int x ;
t=mal loc ( ( p i l e>t a i l l e +1) * ( s izeof ( int ) ) int i ;
); x=p i l e>t [ p i l e>t a i l l e 1] ;
for ( i =0; i<p i l e>t a i l l e ; i++) t [ i ]=p i l e>t p i l e>t a i l l e ;
[i]; t=mal loc ( p i l e>t a i l l e * ( sizeof ( int ) ) ) ;
t [ i ]=x ; for ( i =0; i<p i l e>t a i l l e ; i++) t [ i ]=p i l e>t
p i l e>t a i l l e ++; [i];
f r e e ( p i l e>t ) ; f r e e ( p i l e>t ) ;
p i l e>t=t ; p i l e>t=t ;
} return x ;}
Maintenant, cela est trs inefficace puisque lon recopie toute la pile chaque opration. Il est plus astucieux de
garder un tableau partiellement rempli. Lorsquon dborde, plutt que dallouer un tableau dune case plus
grand, on alloue un tableau deux fois plus grand. Lorsque lon dpile, on ne recopie dans un tableau plus petit
que quand le tableau est aux trois quarts vide, auquel cas on divise sa taille par deux. On travaille donc avec le
type suivant :
struct pi l e_amor t i e {
int t a i l l e ;
int n ;
int * t ;
};
taille reprsente toujours le nombre dlments du tableau t, tandis que n reprsente le nombre de cases
effectivement remplies dans t. Au-del de la nme case, il y a du vide que lon peut remplir.
b) Rcrire les fonctions empile et depile pour des struct pile_amortie.
b)
void empi le ( int x , struct pi l e_amor t i e * p i l e int d e p i l e ( struct pi l e_amor t i e * p i l e ) {
){ int x ;
i f ( p i l e>t a i l l e==p i l e>n ) { p i l e>n;
int * t ; x=p i l e>t [ p i l e>n ] ;
int i ; i f ( p i l e>n<=p i l e>t a i l l e / 4 ) {
p i l e>t a i l l e *=2; int * t ;
t=mal loc ( ( p i l e>t a i l l e ) * ( s izeof ( int ) ) ) ; int i ;
for ( i =0; i<p i l e>n ; i++) t [ i ]=p i l e>t [ i ] ; p i l e>t a i l l e /=2;
f r e e ( p i l e>t ) ; t=mal loc ( p i l e>t a i l l e * ( s izeof ( int ) ) ) ;
p i l e>t=t ; for ( i =0; i<p i l e>n ; i++) t [ i ]=p i l e>t [ i ] ;
} f r e e ( p i l e>t ) ;
p i l e>t [ p i l e>n]=x ; p i l e>t=t ;
p i l e>n++; }
} return x ;
}
3
crire une fonction struct File * alloue_file(void) qui cre une file vide.
crire une fonction int est_vide(struct File * f) qui teste si une file est vide.
crire une fonction void empile(int x, struct File * f) qui empile lentier x la fin de la file f.
crire une fonction int depile(struct File * f) qui retire de la file f son premier lment, et le renvoie en rsultat.
int d e p i l e ( struct Fi l e * f ) {
a s s e r t ( f>debut !=NULL) ;
int x=f>debut>v a l eur ;
struct Li s t e _ tmp=f>debut>suivant ;
f r e e ( f>debut ) ;
i f ( f>debut==f>f i n ) {
f>debut=NULL;
f>f i n=NULL;
} el se f>debut=tmp ;
return x ;
}
crire une fonction void detruit_file(struct File * f) qui dsalloue une file.
void d e t r u i t_f i l e ( struct Fi l e * f ) {
while ( f>debut ) d e p i l e ( f ) ;
free(f);
}