#include "filasm.h"
struct FilaMStr
{
size_t tamanho, base, topo;
void **m;
};
FilaM *FMcria(size_t tamanho)
{
FilaM *f;
if((f = malloc(sizeof(*f))) == 0)
return 0;
if(tamanho == 0)
f->tamanho = FMTAMANHO + 1;
else
f->tamanho = tamanho + 1;
if((f->m = calloc(f->tamanho, sizeof(void *))) == 0)
{
free(f);
return 0;
}
f->topo = f->base = 0;
return f;
}
void FMdestroi(FilaM *f)
{
if(f == 0)
return;
free(f->m);
free(f);
}
FilaM *FMesvazia(FilaM *f)
{
if(f != 0)
f->topo = f->base;
return f;
}
size_t FMquantos(FilaM *f)
{
if(f == 0)
return 0;
return f->topo >= f->base ? f->topo - f->base : f->topo - f->base +
f->tamanho;
}
int FMcheia(FilaM *f)
{
if(f == 0)
return 0;
return FMquantos(f) == f->tamanho - 1;
}
FilaM *FMpoe(FilaM *f, void *d)
{
if(f == 0 || FMcheia(f))
return 0;
f->m[f->topo++] = d;
if(f->topo == f->tamanho)
f->topo = 0;
return f;
}
void *FMtira(FilaM *f)
{
void *d;
if(f == 0 || f->topo == f->base)
return 0;
d = f->m[f->base++];
if(f->base == f->tamanho)
f->base = 0;
return d;
}
#ifdef TESTE
#include <stdio.h>
int main(void)
{
FilaM *f;
int val, *pval;
f = FMcria(7);
do
{
printf("Valor a inserir (0 para sair, negativo para retirar): ");
if(scanf("%d", &val) != 1)
return EXIT_FAILURE;
if(val < 0)
{
printf("Retirando: ");
if((pval = FMtira(f)) == 0)
puts("fila vazia!");
else
{
printf("Retirei %d.\n", *pval);
free(pval);
}
}
else if(val > 0)
{
printf("Inserindo: ");
if((pval = malloc(sizeof(int))) == 0)
return EXIT_FAILURE;
*pval = val;
if(FMpoe(f, pval) == 0)
puts("pilha cheia!");
else
printf("Inseri %d.\n", val);
}
}
while(val != 0);
if(FMcheia(f))
puts("Esta' cheia!");
if(FMquantos(f) != 0)
{
printf("Retirando:");
while((pval = FMtira(f)) != 0)
{
printf(" %d", *pval);
free(pval);
}
putchar('\n');
}
FMdestroi(f);
return EXIT_SUCCESS;
}
#endif