correction td10

Transcription

correction td10
TD10
Programmation en C (LC4)
Semaine du 2 avril 2007
1 Listes
On commence par travailler avec le type de listes suivant :
struct L i s t e f
int v a l e u r ;
struct L i s t e
g;
Exercice 1
suivant ;
Ecrire
une fonction
void decoupe ( struct L i s t e
l , struct L i s t e
l1 , struct L i s t e l 2 )
qui prend une liste l en argument, et la decoupe en deux listes :
{ la liste forme du premier maillon de l, puis du troisieme, puis du cinquieme, . . .
{ la liste forme du deuxieme maillon de l, puis du quatrieme, puis du sixieme, . . .
Le pointeur vers le premier maillon de la premiere (respectivement seconde) liste devra ^etre
ecrit dans *l1 (respectivement *l2).
I Exercice 2
void decoupe ( struct L i s t e l , struct L i s t e l1 , struct L i s t e l 2 ) f
l 1=l ;
i f ( l ) l 2=l > s u i v a n t ; else l 2=NULL;
while ( l ) f
struct L i s t e tmp=l > s u i v a n t ;
i f (tmp) f
l > s u i v a n t=tmp > s u i v a n t ;
l=tmp > s u i v a n t ;
i f (tmp > s u i v a n t ) tmp > s u i v a n t=tmp >suivant > s u i v a n t ; else tmp
g else l=NULL;
g
>s u i v a n t=NULL;
g
Exercice 3 Ecrire
une fonction void filtre(struct Liste * l) qui eace le deuxieme maillon
de la liste, puis le quatrieme, puis le sixieme, . . .
I Exercice 4
void f i l t r e ( struct L i s t e
struct L i s t e tmp ;
while ( l ) f
tmp=l > s u i v a n t ;
l)
f
1
i f (tmp) f
l > s u i v a n t=tmp
f r e e (tmp ) ;
g
g
g
l=l
>s u i v a n t ;
>s u i v a n t ;
2 Arbres
On travaille avec le type :
struct a r b r e f
int v a l e u r ;
struct a r b r e
struct a r b r e
g;
Exercice 5
gauche ;
droite ;
Ecrire
une fonction qui teste si deux arbres ont le m^eme squelette.
I Exercice 6
int meme squelette ( struct a r b r e f , struct a r b r e g ) f
i f ( ! f &&!g ) return 1 ;
else i f ( f&&g ) f
return meme squelette ( f >gauche , g >gauche)&&meme squelette ( f
g else return 0 ;
>d r o i t e , g > d r o i t e ) ;
g
Exercice 7 Ecrire
une fonction qui teste si un arbre f est un prexe d'un arbre g, c'est-a-dire
si l'on peut obtenir f a partir de g en remplacant certains sous-arbres par des arbres vides.
I Exercice 8
int p r e f i x e ( struct a r b r e f , struct a r b r e g ) f
i f ( ! f ) return 1 ;
i f ( ! g ) return 0 ;
i f ( f > v a l e u r !=g > v a l e u r ) return 0 ;
return p r e f i x e ( f >gauche , g >gauche)&& p r e f i x e ( f
g
>d r o i t e , g > d r o i t e ) ;
Exercice 9 Comment denir un type d'arbre ou chaque nud peut avoir un nombre variable
de ls ? Ecrire,
pour ce type une fonction calculant l'arite maximale d'un nud.
I Exercice 10
struct Liste Noeud s ;
struct Arbre f
int v a l e u r ;
struct Liste Noeu ds f i l s ;
g;
struct Liste Noeud s f
struct Arbre noeud ;
2
g;
struct Liste Noeu ds
suivant ;
int a r i t e m a x ( struct Arbre a ) f
int r e s =0;
int tmp ;
int n=0;
struct Liste Noeu ds l=a > f i l s ;
while ( l ) f
n++;
tmp=a r i t e m a x ( l >noeud ) ;
i f (tmp> r e s ) r e s=tmp ;
l=l > s u i v a n t ;
g
g
i f ( n> r e s ) return n ; else return r e s ;
3 Pointeurs vers des fonctions
Exercice 11 Quel est le type d'un pointeur vers une fonction prenant un int en argument et
renvoyant un int en resultat ?
I Exercice 12
int ( ) ( int )
Exercice 13 Ecrire
une fonction int pour_tout(struct Liste * l, int (*predicat)(int))
qui prend en argument une liste l, et un pointeur predicat vers une fonction, et qui determine
si la fonction appliquee a tous les elements de la liste retourne une valeur non-nulle.
I Exercice 14
int p o u r t o u t ( struct L i s t e l , int ( p r e d i c a t ) ( int ) ) f
while ( l ) f
i f ( ( p r e d i c a t ) ( l > v a l e u r ) ) l=l > s u i v a n t ; else return 0 ;
g
g
return 1 ;
Exercice 15 En utilisant la question precedente, ecrire une fonction qui teste si tous les elements
d'une liste sont impairs.
I Exercice 16
int e s t p a i r ( int x )
return x%2==0;
f
g
int t o u s p a i r s ( struct L i s t e l )
return p o u r t o u t ( l ,& e s t p a i r ) ;
f
g
On travaille desormais avec le type suivant :
3
struct L i s t e f
void v a l e u r ;
struct L i s t e s u i v a n t ;
g;
L'idee est que l'on met dans le champ valeur un pointeur vers un objet dont l'on a fait oublier
le type au compilateur. Cela permet d'ecrire du code travaillant sur des listes, independament du
type des objets manipules.
Exercice 17
Ecrire
une fonction
struct L i s t e
i n s e r e ( struct L i s t e
l , void
x , int ( i n f e r i e u r ) ( void
, void ) )
qui prend en argument une liste, un pointeur x vers un objet de type inconnu, et un pointeur
inferieur vers une fonction qui est supposee implementer une relation d'ordre pour laquelle
la liste l est triee ; et qui insere x dans la liste, de sorte qu'elle soit toujours triee. Le resulat
renvoye est le maillon de liste cree pour x.
Par exemple, si les objets stockes dans la liste sont des chaines de caracteres, inferieur
pourrait pointer vers une telle fonction :
int compare chaine ( char
s , char t ) f return
strcmp ( s , t ) > 0; g
I Exercice 18
struct L i s t e i n s e r e ( struct L i s t e l , void
struct L i s t e pere=NULL;
while ( l &&( i n f e r i e u r ) ( l >valeur , x ) ) f
pere=&(l > s u i v a n t ) ;
l=l > s u i v a n t ;
g
g
x , int ( i n f e r i e u r ) ( void
struct L i s t e r e s=malloc ( s i z e o f ( struct L i s t e ) ) ;
res > v a l e u r=x ;
res > s u i v a n t=l ;
i f ( pere ) pere=r e s ;
return r e s ;
4
, void ) ) f