unicstl/datastruct/queue.c
2024-06-18 10:08:40 +08:00

139 lines
2.0 KiB
C

#include "queue.h"
#if QUEUE == 1
bool queue_init(pqueue_t * head)
{
*head = (pqueue_t)malloc(sizeof(queue_t));
if(*head == NULL)
{
return false;
}
(*head)->front = NULL;
(*head)->rear = NULL;
(*head)->size = 0;
return true;
}
void queue_destroy(pqueue_t * head)
{
if(*head != NULL)
{
queue_clear(*head);
free(*head);
*head = NULL;
}
}
bool queue_empty(pqueue_t head)
{
return (head == NULL || head->front == NULL || head->rear == NULL) ? true : false;
}
void queue_clear(pqueue_t head)
{
pqueue_node_t front_item;
if(head != NULL)
{
front_item = head->front;
while(head->front != NULL)
{
head->front = front_item->next;
free(front_item);
front_item = head->front;
}
head->rear = head->front;
head->size = 0;
}
}
uint32_t queue_get_size(pqueue_t head)
{
return head->size;
}
bool queue_in(pqueue_t head, queue_data_t data)
{
pqueue_node_t new_item;
if(head == NULL)
{
return false;
}
new_item = (pqueue_node_t)malloc(sizeof(queue_node_t));
if(new_item == NULL)
{
return false;
}
new_item->data = data;
new_item->next = NULL;
if(head->front == NULL)
{
head->front = new_item;
}
// insert from tail
if(head->rear != NULL)
{
head->rear->next = new_item;
}
head->rear = new_item;
if (head->size < _UI32_MAX)
{
head->size++;
}
return true;
}
void queue_out(pqueue_t head, queue_data_t *data)
{
pqueue_node_t front_item;
if(!queue_empty(head))
{
front_item = head->front;
*data = front_item->data;
// free the front item
head->front = front_item->next;
free(front_item);
front_item = NULL;
if (queue_get_size(head) == 1)
{
head->rear = NULL;
}
if (head > 0)
{
head->size--;
}
}
}
bool queue_get_front(pqueue_t head, queue_data_t *data)
{
if(!queue_empty(head))
{
*data = head->front->data;
return true;
}
else
{
return false;
}
}
bool queue_get_rear(pqueue_t head, queue_data_t *data)
{
if(!queue_empty(head))
{
*data = head->rear->data;
return true;
}
else
{
return false;
}
}
#endif