- C언어로 구현한 큐(queue) 코드이다. 완벽하진 않지만 c에서 객체지향 개념을 넣을 수 있는 기본 베이스는 마련해둔 코드이다.
- 글 말고 github으로 보려면 여기를 누르면 된다.
- 영어를 잘 못하지만 주석을 영어로 작성했으므로 틀린 표현이 많을 수 있다. (댓글로 알려줘요 ㅠ)
- 이하 코드에서 사용된 node.h, list.h, list.c는 '[자료구조] C언어 - 이중 연결 리스트(doubly linked list) 구현 - 객체지향' 글에서 구현한 코드들이다. 위 github에서 보거나, 여기를 눌러 해당 글에서 확인하면 된다.
0. 사용예시
#include<stdio.h>
#include"queue.h"
int main(int argc, char* argv[])
{
queue_t* q = create_queue();
q->op->enqueue(q, "aa");
q->op->enqueue(q, "bb");
q->op->enqueue(q, "cc");
q->op->enqueue(q, "dd");
printf("%s\n", (char*) q->op->dequeue(q));
printf("%s\n", (char*) q->op->dequeue(q));
printf("%s\n", (char*) q->op->peekqueue(q));
printf("%s\n", (char*) q->op->dequeue(q));
printf("%s\n", (char*) q->op->dequeue(q));
q->op->destroy(q);
}
1. queue.h
/**
* Queue Header
* OOP Style
* made by nahwasa
*/
#ifndef QUEUE_H_NAHWASA
#define QUEUE_H_NAHWASA
#include"node.h"
#include"list.h"
typedef struct queue_head {
list_t* list;
struct queue_operations* op;
} queue_t;
struct queue_operations {
void (*enqueue)(struct queue_head* q, void* data);
void* (*dequeue)(struct queue_head* q);
void* (*peekqueue)(struct queue_head* q);
void (*destroy)(queue_t* q);
int (*get_size)(queue_t* q);
int (*is_empty)(queue_t* q);
};
extern queue_t* create_queue();
#endif
2. queue.c
/**
* Queue (using basic_list)
* OOP Style
* made by nahwasa
*/
#include<stdio.h>
#include<stdlib.h>
#include"queue.h"
static void destroy(queue_t* q);
static void enqueue(queue_t* q, void* data);
static void* dequeue(queue_t* q);
static void* peekqueue(queue_t* q);
static int get_size(queue_t* q);
static int is_empty(queue_t* q);
static struct queue_operations op =
{
.destroy = destroy,
.enqueue = enqueue,
.dequeue = dequeue,
.peekqueue = peekqueue,
.get_size = get_size,
.is_empty = is_empty
};
/*
* create queue object and return
*/
queue_t* create_queue()
{
queue_t* q = (queue_t*)malloc(sizeof(queue_t));
q->list = create_list();
q->op = &op;
return q;
}
/*
* release memory
*/
static void destroy(queue_t* q)
{
q->list->op->destroy(q->list);
q->list = NULL;
q->op = NULL;
free(q);
q = NULL;
}
/*
* put one data to queue
*/
static void enqueue(queue_t* q, void* data)
{
q->list->op->insert_to_tail(q->list, data);
}
/*
* get one data from queue and delete
*/
static void* dequeue(queue_t* q)
{
if ( q->list->op->is_empty(q->list) )
return NULL;
node_t* node = q->list->op->get_head_node(q->list);
q->list->op->delete_head_node(q->list);
return node->data;
}
/*
* get one data from queue
*/
static void* peekqueue(queue_t* q)
{
if ( q->list->op->is_empty(q->list) )
return NULL;
node_t* node = q->list->op->get_head_node(q->list);
return node->data;
}
static int get_size(queue_t* q)
{
return q->list->op->get_size(q->list);
}
static int is_empty(queue_t* q)
{
return q->list->op->is_empty(q->list);
}
'CS > Data structures' 카테고리의 다른 글
[자료구조] C언어 - 이진 탐색 트리(BST , binary search tree) 구현 - 객체지향 (0) | 2022.04.09 |
---|---|
[자료구조] C언어 - 우선순위 큐(priority queue) 구현 - 객체지향 (0) | 2022.04.09 |
[자료구조] C언어 - 스택(stack) 구현 - 객체지향 (0) | 2022.04.09 |
[자료구조] C언어 - 다항식(polynomial) 구현 - 객체지향 (0) | 2022.04.09 |
[자료구조] C언어 - 이중 연결 리스트(doubly linked list) 구현 - 객체지향 (0) | 2022.04.09 |
댓글