#include "pile.h" /* Création d'une nouvelle pile */ Pile npile_nouveau(void) { return NULL; } /* Affichage de la pile en hexadécimal */ void npile_afficher(Pile p) { int i; char *pointeur; int octet; if(p == NULL) return; i = p->taille - 1; pointeur = i + (char *)p->element; /* création d'un pointeur de char */ octet = *pointeur; octet = octet & 0x000000FF; /* sélection de la partie à afficher (1 octet correspondant au char) */ printf("%x", octet); /* affichage en hexadécimal */ while(i != 0) /* tant que l'élément n'est pas lu en entier */ { pointeur--; octet = *pointeur; octet = octet & 0x000000FF; printf("-%x", octet); i--; } printf("\n"); npile_afficher(p->suivant); /* on lit l'élément suivant */ } /* Ajouter un élement à la pile */ Pile npile_ajouter(Pile p, void *ajout, int taille) { char *element; char *element_ajout = (char *)ajout; Pile tmp = (Pile)malloc(sizeof(npile_Maillon)); /* allocation d'un nouveau maillon */ if(tmp == NULL) /* si l'allocation a échouée */ { fprintf(stderr, "Erreur lors de l'allocation de tmp dans npile_ajouter\n"); exit(1); } element = (char *)malloc(taille); /* allocation de l'espace pour stocker l'élément */ if(element == NULL) /* si l'allocation a échouée */ { fprintf(stderr, "Erreur lors de l'allocation de element dans npile_ajouter\n"); exit(1); } tmp->suivant = p; tmp->element = (void *)element; tmp->taille = taille; while(taille != 0) /* tant qu'on a pas stocké l'intégralité de l'élément */ { *element = *element_ajout; element_ajout++; element++; taille--; } return tmp; } /* retourner un pointeur void sur le sommet de la pile */ void * npile_sommet(Pile p, int *taille) { if(p == NULL) /* si la pile est vide */ { fprintf(stderr, "La pile p est vide dans la fonction npile_sommet!\n"); exit(1); } if(taille != NULL) /* si on demande la taille */ { *taille = p->taille; } return p->element; } /* retourne la taille de l'élement au sommet */ int npile_taille_sommet(Pile p) { if(p == NULL) /* si la pile est vide */ { fprintf(stderr, "La pile p est vide dans la fonction npile_taille_sommet!\n"); exit(1); } return p->taille; } /* dépiler la pile */ Pile npile_depiler(Pile p) { Pile m; if(p == NULL) /* si la pile est vide */ { fprintf(stderr, "La pile p est vide dans la fonction npile_dépiler!\n"); exit(1); } m = p->suivant; free(p->element); /* on libère l'élément */ free(p); /* on libère le maillon */ return m; } /* vérifier si la pile est vide ou non */ int npile_vide(Pile p) { if(p == NULL) return npile_VIDE; return npile_NONVIDE; } /*supprimer la pile */ Pile npile_supprimer(Pile p) { while(p != NULL) /* tant que la pile n'est pas vide, on la dépile */ p = npile_depiler(p); return NULL; } /* retourner la hauteur de la pile */ int npile_hauteur(Pile p) { if(p == NULL) return 0; /* tant que la pile n'est pas nulle, on retourne la taille de la pile sans le sommet + 1 */ return npile_hauteur(p->suivant) + 1; } int npile_espace_elements(Pile p) { if(p == NULL) return 0; return npile_espace_elements(p->suivant) + p->taille; }