#ifndef __QUEUE_H__
#define __QUEUE_H__
#if defined(cplusplus)
extern "C" {
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
void *data;
struct Node *next;
} Node;
typedef struct Queue {
int size_of_queue;
size_t memory_size_of_node;
Node *head;
Node *tail;
} Queue;
Queue *CreateQueue(size_t _memory_size_of_node)
{
Queue *q = NULL;
q = (Queue *)malloc(sizeof(Queue));
if (q == NULL) {
printf("[E] (%s)(%d) heap memory is shortage size(%d) \n", __FUNCTION__, __LINE__, sizeof(Queue));
return NULL;
}
q->size_of_queue = 0;
q->memory_size_of_node = _memory_size_of_node;
q->head = q->tail = NULL;
return (Queue *)q;
}
int Enqueue(Queue *_queue, const void *_data)
{
Queue *q = _queue;
Node *new_node = NULL;
if (!q) {
// parameter error
printf("[E] (%s)(%d) inputed paramter queue is null \n", __FUNCTION__, __LINE__);
return -1;
}
if (!_data) {
// parameter error
printf("[E] (%s)(%d) inputed paramter data is null \n", __FUNCTION__, __LINE__);
return -1;
}
new_node = (Node *)malloc(sizeof(Node));
if (new_node == NULL) {
printf("[E] (%s)(%d) heap memory is shortage size(%d) \n", __FUNCTION__, __LINE__, sizeof(Node));
return -1;
}
new_node->data = malloc(q->memory_size_of_node);
if (new_node->data == NULL) {
printf("[E] (%s)(%d) heap memory is shortage size(%d) \n", __FUNCTION__, __LINE__, q->memory_size_of_node);
free(new_node);
return -1;
}
// save data
memcpy(new_node->data, _data, q->memory_size_of_node);
if (q->size_of_queue != 0) {
q->tail->next = new_node;
q->tail = new_node;
}
else {
q->head = q->tail = new_node;
}
q->size_of_queue++;
return 0;
}
void Dequeue(Queue *_queue, void *_data)
{
Queue *q = _queue;
if (!q) {
// parameter error
printf("[E] (%s)(%d) inputed paramter queue is null \n", __FUNCTION__, __LINE__);
return;
}
if (q->size_of_queue > 0) {
Node *temp = q->head;
memcpy(_data, temp->data, q->memory_size_of_node);
if (q->size_of_queue > 1) {
q->head = q->head->next;
}
else {
q->head = q->tail = NULL;
}
q->size_of_queue--;
free(temp->data);
free(temp);
}
}
void Peekqueue(Queue *_queue, void *_data)
{
Queue *q = _queue;
if (!q) {
// parameter error
printf("[E] (%s)(%d) inputed paramter queue is null \n", __FUNCTION__, __LINE__);
return;
}
if (q->size_of_queue > 0) {
Node *temp = q->head;
memcpy(_data, temp->data, q->memory_size_of_node);
}
}
void Clearqueue(Queue *_queue)
{
Queue *q = _queue;
Node *temp = NULL;
if (!q) {
// parameter error
printf("[E] (%s)(%d) inputed paramter queue is null \n", __FUNCTION__, __LINE__);
return;
}
while (q->size_of_queue > 0) {
temp = q->head;
q->head = temp->next;
free(temp->data);
free(temp);
q->size_of_queue--;
}
}
int GetSizeQueue(Queue *_queue)
{
Queue *q = _queue;
if (!q) {
// parameter error
printf("[E] (%s)(%d) inputed paramter queue is null \n", __FUNCTION__, __LINE__);
return -1;
}
return q->size_of_queue;
}
void DeleteQueue(Queue *_queue)
{
Queue *q = _queue;
if (!q) {
// parameter error
printf("[E] (%s)(%d) heap memory is shortage size(%d) \n", __FUNCTION__, __LINE__, sizeof(Queue));
return;
}
// clear queue
Clearqueue(q);
// free queue
free(q);
}
#if defined(cplusplus)
}
#endif
#endif
'Programming > C,C++' 카테고리의 다른 글
ModX (0) | 2018.04.28 |
---|---|
macro readbits (0) | 2017.11.24 |
십진수 수에서 '0' 개수 세기 (0) | 2017.04.20 |
List (C, Double Linked) / ...ing (0) | 2017.04.20 |
binary2decimal (0) | 2017.04.19 |