ataka (owner)

Revisions

  • 5b07f5 ataka Fri Apr 03 21:19:36 -0700 2009
  • c08926 ataka Mon Mar 23 13:44:27 -0700 2009
  • f37636 ataka Mon Mar 23 13:42:23 -0700 2009
gist: 83763 Download_button fork
public
Description:
queue sample program
Public Clone URL: git://gist.github.com/83763.git
Embed All Files: show embed
Makefile #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Queue sample program
# Author: Masayuki Ataka <masayuki.ataka@gmail.com>
PROGRAM = queue
 
CC = gcc
CFLAGS = -W -Wall -g -O2 -std=c99
CPPFLAGS = -DDEBUG
 
all: $(PROGRAM)
 
$(PROGRAM): queue.o
$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^
 
queue.o: queue.c queue.h
 
#
# clean
#
RM = rm -f
clean:
$(RM) *~
$(RM) *.o
 
distclean: clean
$(RM) $(PROGRAM)
 
queue.c #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "queue.h"
 
/* ---------------------------------------- *\
Function declaration
\* ---------------------------------------- */
static bool is_empty(const queue_t* const 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(const int n, queue_t* const 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* const 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* const queue)
{
  if (!is_empty(queue)){
      node_t* last = queue->tail;
      queue->tail = last->prev;
      free(last);
  }
  free(queue);
}
 
static bool is_empty(const queue_t* const 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 */
 
queue.h #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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(const int n, queue_t* const queue);
int dequeue(queue_t* const queue);
void del_queue(queue_t* const queue);
 
#endif /* __QUEUE_H__ */