Tchae

Untitled

Nov 16th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.66 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <assert.h>
  5. #include <string.h>
  6.  
  7. // #define nil NULL // pour faire plus lisp
  8. // ^ transposer un langage high-level avec le C relève de la fantaisie.
  9.  
  10. // typedef char * str ;
  11. // ^ concept inexistant en C, gardons une proximité avec ce qu'est
  12. //   réllement ce langage.
  13. //   S'agit-il d'utf8 ou d'autre chose (en terme d'encodage) ? Le C
  14. //   ne sait pas bien définir cet aspect sans une prise en charge
  15. //   par le développeur, aussi, je préfère éviter ce raccourci
  16. //   confus.
  17. //
  18.  
  19. typedef struct tagNODE { char* car; struct tagNODE* cdr; } NODE, *liste;
  20.  
  21. liste cons(char* mot, liste L)
  22. {
  23.     liste result = malloc(sizeof(NODE));
  24.     //PNODE result = malloc(0);
  25.     //
  26.     assert(result != NULL && "Not enough memory available.");
  27.     result->car = mot;
  28.     result->cdr = L;
  29.     return result;
  30. }
  31.  
  32. int length(liste curr)
  33. {
  34.     int result = 0;
  35.     for ( liste item = curr ; NULL != item ; item = item->cdr )
  36.     { ++result; }
  37.     return result;
  38. }
  39.  
  40. void putlist(liste curr)
  41. {
  42.     for ( liste item = curr ; NULL != item ; item = item->cdr )
  43.     { printf("%s ", item->car); }
  44.     // ^ façon propre de travailler
  45. }
  46.  
  47.  
  48. int main(int argc, char** argv)
  49. // ^ déclarer autrement main est hasardeux.
  50. {
  51.     liste list = NULL;
  52.  
  53.     {   // Préparation de la liste à partir des données saisies en statique.
  54.         char* code[] = {"papa", "alpha", "zulu", "hotel", "charlie", "bay", NULL};
  55.         for ( int k = 0 ; NULL != code[k] ; ++k )
  56.         { list = cons(code[k], list); }
  57.  
  58.         printf("Default list:\n");
  59.         putlist(list);
  60.         printf("\n(length %d)", length(list));
  61.         printf("\n--\n");
  62.     }
  63.  
  64.     char** strs = NULL;
  65.  
  66.     {   // création d'un tableau de données avec les saisies à l'envers.
  67.         int listLength = length(list);
  68.         strs = malloc(sizeof(char*)*listLength);
  69.         int id = listLength-1;
  70.         for ( liste item = list ; NULL != item ; item = item->cdr )
  71.         {
  72.             strs[id] = item->car;
  73.             --id;
  74.         }
  75.     }
  76.  
  77.     printf("Array content:\n");
  78.     // on affiche la liste dans le terminal
  79.     for ( int i = 0 ; i < length(list) ; ++i )
  80.     {
  81.         printf("num: %d - valeur: %s\n", i, strs[i]);
  82.     }
  83.  
  84.  
  85.     {   // C'est étonnant, mais on peut aussi vider la mémoire à la fin de l'exécution
  86.         free(strs);
  87.  
  88.         liste item = list;
  89.         do {
  90.             liste tmp = item;
  91.             item = item->cdr;
  92.             free(tmp);
  93.         } while ( NULL != item );
  94.     }
  95.     // mémoire totalement libérée ~~ le programme est libre de se terminer.
  96.  
  97.     return EXIT_SUCCESS;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment