C 言語の勉強で Queue (キュー) のプログラムを組んでる友達がいる。
先日、「@aka なら、15 分位いで queue のプログラムを書けるよね?」と振られたので、「15 分は無理だけど 1、2 時間で作れると思う」と返した。それで気付いたんだけど、ぼくは Queue のプログラムを書いたことがない。せっかくなので、ちょっと挑戦してみた。
int 型のデータを enqueue/dequeue するだけのプログラム。とってもシンプル。
大雑把なコードを書くのに 30 分。バグ潰しに 1 時間。ブラッシュアップに 1 時間。
ソースコードは gist で管理している。ライセンスは GPL (ってほどのコードでもないけど)。fork はご自由に。
ソースコード
ソースコードも一応貼っておく。C99 のソースコード。gcc でコンパイルする時は、-std=c99 オプションが要る。
queue.h
#ifndef __QUEUE_H__
#define __QUEUE_H__
typedef struct node_tt
{
struct node_tt* prev;
int n;
} node_t;
typedef struct
{
node_t* head;
node_t* tail;
} queue_t;
queue_t* new_queue(void);
bool enqueue(int n, queue_t* queue);
int dequeue(queue_t* queue);
void del_queue(queue_t* queue);
#endif /* __QUEUE_H__ */
queue.c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "queue.h"
/* ---------------------------------------- *\
Function declaration
\* ---------------------------------------- */
static bool is_empty(queue_t* q);
/* ---------------------------------------- *\
Functions
\* ---------------------------------------- */
queue_t* new_queue(void)
{
queue_t* q = (queue_t*)malloc(sizeof(queue_t));
if (q == NULL){
fprintf(stderr, "Allocation Error: queue\n");
return NULL;
}
q->tail = NULL;
q->head = q->tail;
return q;
}
/* Return TRUE if succeeded to malloc NEW node, else return FALSE. */
bool enqueue(int n, queue_t* queue)
{
node_t* new = (node_t*)malloc(sizeof(node_t));
if (new == NULL){
fprintf(stderr, "Allocation Error: node\n");
return false;
}
new->n = n;
new->prev = NULL;
if (is_empty(queue)){
queue->tail = new;
} else {
queue->head->prev = new;
}
queue->head = new;
return true;
}
/* Return 0 if queue is empty, else return dequeued value */
int dequeue(queue_t* queue)
{
node_t* last = queue->tail;
if (is_empty(queue)){
fprintf(stderr, "QUEUE is empty\n");
return 0;
} else {
queue->tail = last->prev;
}
int n = last->n;
free(last);
return n;
}
void del_queue(queue_t* queue)
{
if (!is_empty(queue)){
node_t* last = queue->tail;
queue->tail = last->prev;
free(last);
}
free(queue);
}
static bool is_empty(queue_t* q)
{
return q->tail == NULL;
}
#ifdef DEBUG
/* ---------------------------------------- */
int main(void)
{
queue_t* q = new_queue();
enqueue(5, q);
enqueue(4, q);
enqueue(3, q);
printf("%d\n", dequeue(q));
printf("%d\n", dequeue(q));
printf("%d\n", dequeue(q));
// queue is empty
// dequeue error check when queue is empty
printf("%d\n", dequeue(q));
enqueue(2, q);
printf("%d\n", dequeue(q));
// queue is empty
del_queue(q);
return 0;
}
#endif /* DEBUG */
0 件のコメント:
コメントを投稿