#ifndef QUEUE_H #define QUEUE_H #define QUEUE_SIZE 10 typedef struct queue { int buffer[QUEUE_SIZE]; int head; int size; int tail; int (*isFull)(struct queue* const me); int (*isEmpty)(struct queue* const me); int (*getSize)(struct queue* const me); void (*insert)(struct queue* const me, int k); int (*remove)(struct queue* const me); }QUEUE; void Queue_Init(QUEUE* me, int (*isFullFunction)(QUEUE* const me), int (*isEmptyFunction)(QUEUE* const me), int (*getSizeFunction)(QUEUE* const me), void (*insertFunction)(QUEUE* const me, int k), int (*removeFunction)(QUEUE* const me)); void Queue_Cleanup(QUEUE* const me); int Queue_isFull(QUEUE* const me); int Queue_isEmpty(QUEUE* const me); int Queue_getSize(QUEUE* const me); void Queue_insert(QUEUE* const me, int k); int Queue_remove(QUEUE* const me); QUEUE* Queue_Create(void); void Queue_Destroy(QUEUE* const me); #endif
#include <stdio.h> #include <stdlib.h> #include "queue.h" void Queue_Init(QUEUE* me, int (*isFullFunction)(QUEUE* const me), int (*isEmptyFunction)(QUEUE* const me), int (*getSizeFunction)(QUEUE* const me), void (*insertFunction)(QUEUE* const me, int k), int (*removeFunction)(QUEUE* const me)){ me->head=0; me->tail=0; me->size=0; me->isFull=isFullFunction; me->isEmpty=isEmptyFunction; me->getSize=getSizeFunction; me->insert=insertFunction; me->remove=removeFunction; } void Queue_Cleanup(QUEUE* const me){ } int Queue_isFull(QUEUE* const me){ return (me->head+1)%QUEUE_SIZE==me->tail; } int Queue_isEmpty(QUEUE* const me){ return me->head==me->tail; } int Queue_getSize(QUEUE* const me){ return me->size; } void Queue_insert(QUEUE* const me, int k){ if (!me->isFull(me)) { me->buffer[me->head]=k; me->head=(me->head+1)%QUEUE_SIZE; ++me->size; } } int Queue_remove(QUEUE* const me){ int value=-9999; if(!me->isEmpty(me)) { value=me->buffer[me->tail]; me->tail=(me->tail+1)%QUEUE_SIZE; --me->size; } return value; } QUEUE* Queue_Create(void){ QUEUE* me=(QUEUE*)malloc(sizeof(QUEUE)); if (me!=NULL) { Queue_Init(me,Queue_isFull,Queue_isEmpty,Queue_getSize, Queue_insert,Queue_remove); } return me; } void Queue_Destroy(QUEUE* const me){ if (me!=NULL) { Queue_Cleanup(me); } free(me); }
#include "queue.h" #include <stdlib.h> #include <stdio.h> int main(void) { int j,k,h,t; QUEUE* myQ; myQ=Queue_Create(); k=1000; for (j = 0; j<QUEUE_SIZE; j++) { h=myQ->head; myQ->insert(myQ, k); printf("inserting %d at position %d, size=%d\n", k--,h,myQ->getSize(myQ)); } printf("Iserted %d elements\n", myQ->getSize(myQ)); for (j = 0; j<QUEUE_SIZE; j++) { t=myQ->tail; k=myQ->remove(myQ); printf("Removing %d at position %d, size=%d\n", k, t, myQ->getSize(myQ)); } printf("Last item removed = %d\n", k); printf("Current queue size %d\n", myQ->getSize(myQ)); puts("Queue test program"); return 0; }