queue in c

Programming/C,C++ 2017. 10. 8. 22:29

queue.h



#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
Posted by 루나s
,