#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define FALSE 0
#define TRUE !FALSE
typedef char boolean;
//Cola propiamente dicha
typedef struct{
void *elementos;
int size;
int head, //Cantidad de puts();
tail; //Cantidad de Gets();
}cola_t;
//Estructura Administrativa
typedef struct{
cola_t *cola;
int sizeTipo;
}queue_t;
queue_t *qCreate(int size, int sizeTipo){
queue_t
*queue
= (queue_t
*)malloc(sizeof(queue_t
));
queue
->cola
= (cola_t
*)malloc(sizeof(cola_t
)); queue->sizeTipo = sizeTipo;
queue
->cola
->elementos
= (void *)malloc(sizeTipo
* size
); assert(queue
->cola
->elementos
);
queue->cola->size = size;
queue->cola->head = queue->cola->tail = 0;
return queue;
}
void qDestroy(queue_t *queue){
}
int qFull(queue_t *queue){
if(queue && queue->cola) //Si tengo queue
return ((queue->cola->tail - queue->cola->head) == queue->cola->size);
return -1; //No hay cola, devuelvo -1
}
int qEmpty(queue_t *queue){
if(queue && queue->cola) //si tengo queue
return (queue->cola->tail == queue->cola->head);
return -1; //No hay cola
}
boolean qPut(queue_t *queue, void *valor){
if(qFull(queue))
return FALSE; //Esta llena y no puedo ingresar nada
memcpy( ((char *)(queue
->cola
->elementos
))+(queue
->cola
->tail
% queue
->cola
->size
), valor
, queue
->sizeTipo
); valor = (void *)valor;
printf("Guardado: %dn",*( ((char*)(queue
->cola
->elementos
))+(queue
->cola
->tail
)) ); //printf(" ingresado en: %dn",queue->cola->tail % queue->cola->size);
queue->cola->tail++;
return TRUE;
}
boolean qGet(queue_t *queue, void *valor){
if(qEmpty(queue))
return FALSE; //Esta vacia y no puedo ingresar nada
/*
* Resuelvo el problema de q los
* indices crezcan hacia el infinito
*/
if(queue->cola->head > queue->cola->size){
queue->cola->head %= queue->cola->size;
queue->cola->tail %= queue->cola->size;
}
memcpy(valor
,((char *)(queue
->cola
->elementos
))+(queue
->cola
->head
% queue
->cola
->size
), queue
->sizeTipo
);
printf("Removido: %dn",*((char *)(queue
->cola
->elementos
))+(queue
->cola
->head
% queue
->cola
->size
)); //printf("en exa: %0xn",valor);
//printf(" removido de: %dn",queue->cola->head % queue->cola->size);
queue->cola->head++;
return TRUE;
}
int main(void){
queue_t *queue;
int a = 15, b = 22, c,d;
queue = qCreate(5,sizeof(int));
qPut (queue,(void *)&a);
qPut (queue,(void *)&b);
qGet(queue,(void *)&c);
qGet(queue,(void *)&d);
printf("El primer valor que extraje fue : %dn",c
); printf("Ese mismo valor mostrado antes pero casteado a (char) : %dn",(char)c
);
printf("el segundo valor que extraje fue: %dn",d
);
qDestroy(queue);
return 0;
}