배우고픈 공돌이

범용 큐 본문

C, C++ /C

범용 큐

내 마음 아홉수 2018. 1. 13. 01:19
//main.c
#include <stdio.h>
#include "queue.h"

int main(void)
{
	queue_t q1, q2;

	initQueue(&q1,10,sizeof(int));
	initQueue(&q2,100,sizeof(double));

	int i=100;
	push(&q1,&i);
	i=200;
	push(&q1,&i);
	i=300;
	push(&q1,&i);

	double j = 900.9;
	push(&q2,&j);
	j=800.8;
	push(&q2,&j);
	j=700.7;
	push(&q2,&j);
	
	pop(&q1,&i);
	printf("q1 1st pop : %d \n",i);
	pop(&q1,&i);
	printf("q1 2nd pop : %d \n",i);
	pop(&q1,&i);
	printf("q1 3rd pop : %d \n",i);

	pop(&q2,&j);
	printf("s2 1st pop : %f \n",j);
	pop(&q2,&j);
	printf("s2 2nd pop : %f \n",j);
	pop(&q2,&j);
	printf("s2 3rd pop : %f \n",j);
	
	cleanupQueue(&q1);
	cleanupQueue(&q2);

	return 0;
}






//queue.c
#include "queue.h"
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>

void initQueue(queue_t* q, int size, int element_size)
{
	q -> pArr = malloc(element_size*size);
	assert( q->pArr );

	q -> element_size = element_size;
	q -> size = size;
	q -> front = 0;
	q -> rear = 0;
}

void cleanupQueue(queue_t* q)
{
	free( q->pArr );
}

void push(queue_t* q,const void* pData)
{
	assert( (q->rear + 1) % q->size != q->front);	
	memcpy((unsigned char*)q->pArr+((q->rear) * (q->element_size)), pData,q->element_size);
	q->rear = ( q->rear + 1) % q->size;
}

void pop(queue_t* q, void* pData)
{
	assert( q->rear != q->front );
	memcpy(pData,(unsigned char*)q->pArr+((q->front)*(q->element_size)),q->element_size);
	q->front = (q->front + 1) % q->size;
}





//queue.h
#ifndef QUEUE_H
#define QUEUE_H

typedef struct {
	void* pArr;
	int  element_size;
	int  rear;
	int front;
	int  size;
} queue_t;

void initQueue(queue_t* q, int size, int element_size);
void cleanupQueue(queue_t* q);
void push(queue_t* q, const void* pData);
void pop(queue_t* q, void* pData);

#endif

'C, C++ > C' 카테고리의 다른 글

범용 싱글 리스트  (0) 2018.01.13
범용 스택  (0) 2018.01.13
code fighter - interview - str1  (0) 2017.12.04
등가 포인터  (0) 2017.08.11
volatile  (0) 2017.08.07
Comments