Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef struct Doublet {void * car ; struct Doublet * cdr ;} * list ; // la structure de base ; list est un pointeur sur un doublet
- #define car(doublet) ((doublet)->car) // macro plutôt que fonction, pour pouvoir écrire car(x)
- #define cdr(doublet) ((doublet)->cdr)
- list cons(void *, list, size_t taille) ; // prototype de la fonction cons
- int main(int argc, char * argv[]){
- // *********************
- // Construire en C une liste L à quatre éléments dans le code du programme à l'aide de cons.
- // Testez car(L), car(cdr(L), car(cdr(cdr L)), car(cdr(cdr(cdr L))), en affichant leur résultat.
- // *********************
- long d = 1, e=2, f=3, g=4;
- list L = cons(&d, cons(&e, cons(&f, cons(&g, NULL, sizeof(long)), sizeof(long)),sizeof(long)),sizeof(long));
- printf("car(L) : %lu\n", *(long*) car(L) );
- printf("car(cdr(L)) : %lu\n", *(long *) car(cdr(L)) );
- printf("car(cdr(cdr (L))) : %lu\n", *(long *) car(cdr(cdr (L))) );
- printf("car(cdr(cdr(cdr (L)))) : %lu\n", *(long *) car(cdr(cdr(cdr (L)))));
- // avec une chaine :
- char * c1="Bonjour", * c2="John_", *c3 = "ça", *c4=" va ?";
- printf("%lu\n", strlen(c1));
- list L2 = cons(c1, cons(c2, cons(c3, cons(c4, NULL, strlen(c4)), strlen(c3)), strlen(c2)), strlen(c1));
- printf("car(cdr(L2)): %s\n", (char*) car( (cdr (L2))));
- // temp test
- int a = 1, b=2, c=3;
- list LL = cons( &a, cons( &b, cons(&c, NULL, sizeof(int)), sizeof(int)), sizeof(int));
- printf("car(LL) : %d\n", *(int *) car(cdr(LL)) );
- float af = 1.33, bf=2.254, cf=3.214;
- list LF = cons( &af, cons( &bf, cons(&cf, NULL, sizeof(float)), sizeof(float)), sizeof(float));
- printf("car(LF) : %f\n", *(float *) car(cdr(LF)) );
- return 0 ;
- }
- // Définition de la fonction cons ; elle renvoie un pointeur sur un doublet
- list cons(void * elt, const list L, size_t taille){
- list Cons = malloc(sizeof(struct Doublet)) ;
- void * dest=malloc(taille);
- memcpy(dest, elt, taille); // allocation mémoire d'un doublet
- car(Cons) = elt ;
- cdr(Cons) = L ;
- return Cons ; }
Advertisement
Add Comment
Please, Sign In to add comment