1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
| #include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define SZ_ALLOC (10)
typedef int t_pixel;
// Création d'une structure de pile qui va contenir les differents pixels
typedef struct {
t_pixel* tab;
size_t top;
size_t size;
} t_stack;
// Initialisation d'une pile
void stack_init(t_stack* stack) {
stack->top=0;
stack->size=0;
stack->tab=NULL;
}
// Ajouter un pixel
t_stack* stack_push(t_stack* stack, t_pixel* pixel) {
// Vérification pile pleine
if (stack->top == stack->size) {
// Agrandissement
stack->size+=SZ_ALLOC;
// Nouvelle allocation (ou allocation si tab==NULL ce qui est le cas la première fois)
t_pixel* new=realloc(stack->tab, stack->size * sizeof(*new));
// Allocation échouée
if (new == NULL) {
// Abandon
fprintf(stderr, "Critical : the stack is not reallocated\n");
free(stack->tab);
return NULL;
}
// Allocation ok, récupération nouvelle pile
stack->tab=new;
}
// Ici on sait qu'on a la place pour le pixel
memcpy(&stack->tab[stack->top], pixel, sizeof(*pixel));
// On a un pixel de plus
stack->top++;
// Récupération ok
return stack;
}
// Retirer un pixel et nous le retourner
t_stack* stack_pop(t_stack* stack, t_pixel* pixel) {
// Vérification pile vide
if (stack->top == 0) {
// Abandon
fprintf(stderr, "Critical : the stack is empty\n");
return NULL;
}
// On a un pixel de moins
stack->top--;
// On récupère le dernier pixel de la pile
memcpy(pixel, &stack->tab[stack->top], sizeof(*pixel));
// Récupération ok
return stack;
}
// Nettoyer la pile
void stack_free(t_stack* stack) {
free(stack->tab);
}
void stack_dump(t_stack* stack) {
if (stack->tab == NULL) {
printf("Pile vide, abort\n");
return;
}
printf("tab=%p, top=%lu, size=%lu\n", stack->tab, stack->top, stack->size);
size_t i;
t_pixel* pt;
for (i=0, pt=stack->tab; i < stack->top; i++, pt++)
printf("tab[%lu/%lu]=%d\n", i+1, stack->top, *pt);
}
int main() {
t_stack stack;
t_pixel pixel;
// Remplissage
stack_init(&stack);
while (1) {
fputs("Entrez un nombre (0 pour terminer) :", stdout); fflush(stdout);
scanf("%d", &pixel);
if (pixel == 0) break;
if (stack_push(&stack, &pixel) == NULL) {
fprintf(stderr, "Insertion %d échouée, on recommence\n", pixel);
stack_init(&stack);
continue;
}
printf("Insertion %d ok\n", pixel);
}
// Vérification
stack_dump(&stack);
// Récupération
while (1) {
if (stack_pop(&stack, &pixel) == NULL) {
fputs("Récupération terminée\n", stdout);
break;
}
printf("Pixel=%d\n", pixel);
}
// Netoyage
stack_free(&stack);
} |
Partager