LibRCG  3.1.1
queue.c
Go to the documentation of this file.
1 
9 #include <stdlib.h>
10 #include "queue.h"
11 
13 {
14  Queue queue=malloc(sizeof(SQueue));
15  if(queue)
16  {
17  queue->size=0;
18  queue->head=NULL;
19  queue->last=NULL;
20  }
21  return queue;
22 }
23 
24 //==============================================================================
25 
26 void queueDelete(Queue queue)
27 {
28  QueueNode aux1,aux2;
29  if(!queue->size) free(queue);
30  else
31  {
32  for(aux1=queue->head;aux1;)
33  {
34  aux2=aux1;
35  aux1=aux1->next;
36  free(aux2);
37  }
38  free(queue);
39  }
40 }
41 
42 //==============================================================================
43 
44 int queueInsert(Queue queue,void* value)
45 {
46  int result=0;
47  QueueNode new;
48  new=malloc(sizeof(SQueueNode));
49  if(new)
50  {
51  new->value=value;
52  new->next=NULL;
53  if(!queue->size) queue->head=new;
54  else queue->last->next=new;
55  queue->last=new;
56  queue->size++;
57  }
58  else result=1;
59  return result;
60 }
61 
62 //==============================================================================
63 
64 int queueRemove(Queue queue,void** value)
65 {
66  int result=0;
67  QueueNode aux;
68  if(!queue->size)
69  {
70  if(value) *value=NULL;
71  result=1;
72  }
73  else
74  {
75  if(value) *value=queue->head->value;
76  if(queue->size==1)
77  {
78  free(queue->head);
79  queue->last=NULL;
80  queue->head=NULL;
81  }
82  else
83  {
84  aux=queue->head;
85  queue->head=queue->head->next;
86  free(aux);
87  }
88  queue->size--;
89  }
90  return result;
91 }
92 
93 //==============================================================================
94 
95 int queueConsult(Queue queue,void** value)
96 {
97  int result=0;
98  if(!queue->size)
99  {
100  *value=NULL;
101  result=1;
102  }
103  else *value=queue->head->value;
104  return result;
105 }
106 
107 //==============================================================================
108 
109 int queueSize(Queue queue)
110 {
111  return queue->size;
112 }
113 
114 //==============================================================================
115 
116 int queueMap(Queue queue,void(*fun)(void*))
117 {
118  int result=0;
119  QueueNode aux;
120  if(queue->size==0) result=1;
121  else
122  {
123  for(aux=queue->head;aux;aux=aux->next)
124  fun(aux->value);
125  }
126  return result;
127 }
128 
129 //==============================================================================
130 
132 {
133  int ctrl;
134  QueueNode aux;
135  Iterator it;
136  it=newIt(queue->size);
137  for(aux=queue->head,ctrl=0;aux&&!ctrl;aux=aux->next)
138  ctrl=itAdd(it,aux->value);
139  if(ctrl)
140  {
141  itDelete(it);
142  it=NULL;
143  }
144  return it;
145 }
int size
Number of elements of this queue.
Definition: queue.h:38
void queueDelete(Queue queue)
Deletes a queue.
Definition: queue.c:26
int queueRemove(Queue queue, void **value)
Removes an element from a queue.
Definition: queue.c:64
Queue node structure.
Definition: queue.h:19
QueueNode last
Last node.
Definition: queue.h:43
Queue structure.
Definition: queue.h:35
int queueConsult(Queue queue, void **value)
Provides the value at the head of a queue.
Definition: queue.c:95
struct sQueueNode * next
Next node.
Definition: queue.h:24
Iterator structure.
Definition: iterator.h:17
Implementation of a queue as linked list.
void itDelete(Iterator it)
Deletes an iterator.
Definition: iterator.c:36
int itAdd(Iterator it, void *val)
Adds an element to an iterator.
Definition: iterator.c:44
Iterator queueIterator(Queue queue)
Creates an iterator from a queue.
Definition: queue.c:131
int queueSize(Queue queue)
Returns the size of a queue.
Definition: queue.c:109
QueueNode head
Apontador para o início da queue.
Definition: queue.h:41
Queue newQueue(void)
Creates a queue.
Definition: queue.c:12
void * value
Node's value.
Definition: queue.h:22
int queueMap(Queue queue, void(*fun)(void *))
Applies a function to the elements of a queue.
Definition: queue.c:116
int queueInsert(Queue queue, void *value)
Inserts an element in a queue.
Definition: queue.c:44
Iterator newIt(int size)
Creates an iterator.
Definition: iterator.c:12

LibRCG © 2004-2015   Rui Carlos Gonçalves