Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdint.h>
- #include <assert.h>
- #include <string.h>
- // #define nil NULL // pour faire plus lisp
- // ^ transposer un langage high-level avec le C relève de la fantaisie.
- // typedef char * str ;
- // ^ concept inexistant en C, gardons une proximité avec ce qu'est
- // réllement ce langage.
- // S'agit-il d'utf8 ou d'autre chose (en terme d'encodage) ? Le C
- // ne sait pas bien définir cet aspect sans une prise en charge
- // par le développeur, aussi, je préfère éviter ce raccourci
- // confus.
- //
- typedef struct tagNODE { char* car; struct tagNODE* cdr; } NODE, *liste;
- liste cons(char* mot, liste L)
- {
- liste result = malloc(sizeof(NODE));
- //PNODE result = malloc(0);
- //
- assert(result != NULL && "Not enough memory available.");
- result->car = mot;
- result->cdr = L;
- return result;
- }
- int length(liste curr)
- {
- int result = 0;
- for ( liste item = curr ; NULL != item ; item = item->cdr )
- { ++result; }
- return result;
- }
- void putlist(liste curr)
- {
- for ( liste item = curr ; NULL != item ; item = item->cdr )
- { printf("%s ", item->car); }
- // ^ façon propre de travailler
- }
- int main(int argc, char** argv)
- // ^ déclarer autrement main est hasardeux.
- {
- liste list = NULL;
- { // Préparation de la liste à partir des données saisies en statique.
- char* code[] = {"papa", "alpha", "zulu", "hotel", "charlie", "bay", NULL};
- for ( int k = 0 ; NULL != code[k] ; ++k )
- { list = cons(code[k], list); }
- printf("Default list:\n");
- putlist(list);
- printf("\n(length %d)", length(list));
- printf("\n--\n");
- }
- char** strs = NULL;
- { // création d'un tableau de données avec les saisies à l'envers.
- int listLength = length(list);
- strs = malloc(sizeof(char*)*listLength);
- int id = listLength-1;
- for ( liste item = list ; NULL != item ; item = item->cdr )
- {
- strs[id] = item->car;
- --id;
- }
- }
- printf("Array content:\n");
- // on affiche la liste dans le terminal
- for ( int i = 0 ; i < length(list) ; ++i )
- {
- printf("num: %d - valeur: %s\n", i, strs[i]);
- }
- { // C'est étonnant, mais on peut aussi vider la mémoire à la fin de l'exécution
- free(strs);
- liste item = list;
- do {
- liste tmp = item;
- item = item->cdr;
- free(tmp);
- } while ( NULL != item );
- }
- // mémoire totalement libérée ~~ le programme est libre de se terminer.
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment