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