//Queue ADT Types Definitions
#include <stdbool.h>
#include <stdlib.h>
typedef struct node
{
void* dataPtr;
struct node* next;
} QUEUE_NODE;
typedef struct
{
QUEUE_NODE* front;
QUEUE_NODE* rear;
int count;
}QUEUE; //metadata
//Prototype
QUEUE* createQueue(void);
QUEUE* destroyQueue(QUEUE* queue);
bool dequeue(QUEUE* queue, void** itemPtr);
bool enqueue(QUEUE* queue, void* itemPtr);
bool queueFront(QUEUE* queue, void** itemPtr);
bool queueRear(QUEUE* queue, void** itemPtr);
int queueCount(QUEUE* queue);
bool emptyQueue(QUEUE* queue);
bool fullQueue(QUEUE* queue);
//End of Queue ADT Definitions
//CreateQueue
QUEUE* createQueue(void)
{
QUEUE* queue;
queue
= (QUEUE
*)malloc(sizeof(QUEUE
)); if (queue)
{
queue->front = NULL;
queue->rear = NULL;
queue->count = 0;
} //if
return queue;
}//createQueue
//Enqueue
bool enqueue(QUEUE* queue, void* itemPtr)
{
QUEUE_NODE* newPtr;
if (!(newPtr =
(QUEUE_NODE
*)malloc(sizeof(QUEUE_NODE
)))) return false;
newPtr->dataPtr = itemPtr;
newPtr->next = NULL;
if (queue->count == 0)
//inserting into null queue
queue->front = newPtr;
else
queue->rear->next = newPtr;
(queue->count)++;
queue->rear = newPtr;
return true;
}//enqueue
//Dequeue
bool dequeue(QUEUE* queue, void** itemPtr)
{
QUEUE_NODE* deleteLoc;
if (!queue->count)
return false;
*itemPtr = queue->front->dataPtr;
deleteLoc = queue->front;
if (queue->count == 1)
//Deleting only item in queue
queue->rear = queue->front = NULL;
else
queue->front = queue->front->next;
(queue->count)--;
return true;
}//dequeue
//queueFront
bool queueFront(QUEUE* queue, void** itemPtr)
{
if (!queue->count)
return false;
else
{
*itemPtr = queue->front->dataPtr;
return true;
}//else
}//queueFront
//queueRear
bool queueRear(QUEUE* queue, void** itemPtr)
{
if (!queue->count)
return false;
else
{
*itemPtr = queue->rear->dataPtr;
return true;
}
}//queueRear
//emptyQueue
bool emptyQueue(QUEUE* queue)
{
return (queue->count == 0);
}//emptyQueue
//fullQueue
bool fullQueue(QUEUE* queue)
{
QUEUE_NODE* temp;
temp
= (QUEUE_NODE
*)malloc(sizeof(*(queue
->rear
))); if (temp)
{
return true;
}//if
//Heap Full
return false;
}//fullQueue
//destroyQueue
QUEUE* destroyQueue(QUEUE* queue)
{
QUEUE_NODE* deletePtr;
if (queue)
{
while (queue->front != NULL)
{
free(queue
->front
->dataPtr
); deletePtr = queue->front;
queue->front = queue->front->next;
}//while
}//if
return NULL;
}//destroyQueue