Tchae

Untitled

Nov 15th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.90 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define nil NULL // pour faire plus lisp
  5.  
  6. typedef char * str ;
  7. typedef struct node { str car ; struct node * cdr ; } node, * list ;
  8.  
  9. void putlist(list L);
  10. list cons(str car, list L);
  11. void usage(str message);
  12. int length(list L);
  13. int decons(list L, str *tablChaine);
  14. void affChaine(str * tablChaine);
  15.  
  16. // Ce programme crée d'abord une liste L à partir du tableau code (fonction cons),
  17. // ensuite affiche la liste L (dans l'ordre inverse) grace à putList,
  18. // puis transcrit la liste L dans un nouveau tableau tablChaine (fonction decons),
  19. // et finalement affiche le  nouveau tableau tablChaine (fonction affChaine).
  20. // Le programme est écrit pour s'adapter à la taille du tableau code (affecté au début du programme),
  21. // même la taile de tablChaine pour laquelle de la mémoire est alloué dynamiquement
  22. // en fonction de la taille de la liste + 1 pour le nil final (30 pour les plus longs mots en français, voir wikipedia).
  23. // A ma grande surprise, si j'alloue 0 en mémoire à la place de lon * sizeof(char *) et 30 * sizeof(char)
  24. // le programme tourne toujours !!!
  25.  
  26. int main(){
  27.     int k=0;
  28.     list L = nil ;
  29.     printf("%ld\n", sizeof(node));
  30.     char * code[]={"papa", "alpha", "zulu", "hotel", "charlie", "bay", nil};
  31.     while (code[k]) L = cons(code[k++], L) ;        
  32.     putlist(L) ;
  33.     int lon= length(L)+1;
  34.     str *tablChaine= malloc(0);    //lon* sizeof(char *)
  35.     for(int i=0; i<lon; i++) tablChaine[i] = malloc(0); // 30 * sizeof(char)
  36.     decons(L,tablChaine);
  37.     printf("\n");
  38.     affChaine(tablChaine);
  39.     return 0 ;
  40. }
  41.  
  42. list cons(str car, list L){
  43.     list new = malloc(sizeof(node)) ;
  44.     if (! new) usage("cons : manque de RAM") ; // enfin, un peu de sérieux !
  45.     new -> car = car ;
  46.     new -> cdr = L ;
  47.     return new ;
  48. }
  49.  
  50. void putlist(list L){
  51.     if (! L) return ; // nil : fin de liste
  52.     putlist(L -> cdr) ;
  53.     printf("%s ", L -> car) ;    
  54. }
  55.  
  56. // une version recursive de length
  57. int length(list L){
  58.     if (! L) return 0;
  59.     else return (1+length(L -> cdr));
  60. }
  61.  
  62. // decons() remplit le tableau tablChaine à partir de la liste L en ordre inverse
  63. // la fin du tableau est marquée par nil, j'utilise une liste auxiliaire new
  64. // comme dans la fonction cons
  65. // Pareil ici si je fais malloc(0) le programme tourne toujours ???!!!
  66. int decons(list L, str *tablChaine){
  67.     list new =malloc(sizeof(node)) ;
  68.     if (! new) usage("cons : manque de RAM") ; // enfin, un peu de sérieux !
  69.     new=L;
  70.     int lon = length(L);
  71.     for (int i=lon-1; i>=0; i--) {  
  72.         tablChaine[i] =new->car;
  73.         new=new->cdr;        
  74.     }
  75.     tablChaine[lon] =nil;
  76.     return 0;
  77. }
  78.  
  79. // Affiche un tableau de chaines qui se termine par nil
  80. void affChaine(str * tablChaine){
  81.     int i=0;
  82.     while(tablChaine[i]) printf(" %s ",  tablChaine[i++]);
  83. }
  84.  
  85. void usage(str message) { fprintf(stderr, "%s\n", message) ; exit(1) ; }
Advertisement
Add Comment
Please, Sign In to add comment