저번편에서 c 로 포팅하다보니 ucs2 를 utf-8 로 변환하는 함수도 필요하고,
큐(queue)의 필요성을 느꼈음. 위 루비 코드의 의미는, @seq 라는 queue 에 @c 를 넣으라는 거임.
표준 c 에 큐가 있긴 있음. insque(), remque() 라고 있는데, api 가 그지같아 써먹기가 그지같음
그래서 c 로 큐를 만들었음.
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> typedef struct _TianNode TianNode; struct _TianNode { TianNode *next; void *data; }; typedef struct _TianQueue TianQueue; struct _TianQueue { TianNode *head; TianNode *tail; unsigned int count; void (* free_func) (void *); }; TianQueue *tian_queue_new (void (* free_func) (void *)) { TianQueue *q; q = calloc (1, sizeof (TianQueue)); q->free_func = free_func; return q; } void tian_queue_free (TianQueue *q) { TianNode *p = q->head; while (p) { if (q->free_func && p->data) q->free_func (p->data); TianNode *next = p->next; free (p); p = next; } free (q); } void tian_queue_add (TianQueue *q, void *data) { TianNode *node = malloc (sizeof (TianNode)); node->next = NULL; node->data = data; if (!q->count) q->head = node; else q->tail->next = node; q->tail = node; q->count++; } bool tian_queue_remove (TianQueue *q) { if (!q->count) return false; TianNode *node; node = q->head; q->head = q->head->next; q->count--; if (q->free_func) q->free_func (node->data); free (node); return true; } void *tian_queue_peek (TianQueue *q, unsigned int i) { if (!q->count) return NULL; TianNode *p; for (p = q->head; i > 0 && p; i--) p = q->head->next; return p->data; } int main (int argc, char **argv) { TianQueue *queue; char *str; queue = tian_queue_new (free); tian_queue_add (queue, strdup ("Hello0")); tian_queue_add (queue, strdup ("Hello1")); tian_queue_add (queue, strdup ("Hello2")); str = tian_queue_peek (queue, 0); puts (str); tian_queue_remove (queue); str = tian_queue_peek (queue, 0); puts (str); tian_queue_free (queue); return 0; }디씨 특성상 아마 꺽쇠 괄호가 다 짤렸을거 같은데, 나름 실용적으로 만들어봤음.
그런데, 다 만들고나서 보니까.. seq[5] 이걸 활용해서 queue 로 쓰는것보다 오버헤드가 클 거 같음.
다음 편에서는 유니코드 ucs2, ucs4 를 utf-8 로 변환하는 함수를 만들 거임.
그리고 seq[5] 이런 배열을 queue 로 사용하는 방법도 모색해보고.
이쩌 좀... 배보다 배꼽이 더 커지는 느낌일세~~~
저 위의 queue 코드에서 봐야할 부분이... free_func 부분. free_func 를 지정해주면 tian_queue_remove 할 때, tian_queue_free 할 때, node->data 까지 모두 해제됨.
연재는 개추
아조씨 C만 깎으시네요 C++ 하실 생각 없으십니까?
c++을 모름 ㅠㅠ
tian_queue_peek 에 버그 있네 ㅠㅠ p = q->head->next; 가 아니라 p = p->next;