-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcola.c
103 lines (64 loc) · 1.75 KB
/
cola.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
#include "cola.h"
#include <stdlib.h>
typedef struct nodo {
void* dato;
struct nodo* prox;
} nodo_t;
struct cola {
nodo_t* primero;
nodo_t* ultimo;
};
/* *****************************************************************
* AUXILIARES DE LA COLA
* *****************************************************************/
nodo_t* nodo_crear(void* valor) {
nodo_t* nodo = malloc(sizeof(nodo_t));
if (nodo == NULL) return NULL;
nodo->dato = valor;
nodo->prox = NULL;
return nodo;
}
/* *****************************************************************
* PRIMITIVAS DE LA COLA
* *****************************************************************/
cola_t* cola_crear(void) {
cola_t* cola = malloc(sizeof(cola_t));
if (cola == NULL) return NULL;
cola->primero = NULL;
cola->ultimo = NULL;
return cola;
}
bool cola_esta_vacia(const cola_t *cola) {
if (cola->primero == NULL) return true;
return false;
}
void* cola_ver_primero(const cola_t *cola) {
if (cola_esta_vacia(cola)) return NULL;
return cola->primero->dato;
}
void cola_destruir(cola_t *cola, void destruir_dato(void*)) {
while(cola->primero != NULL){
void* valor = cola_desencolar(cola);
if (destruir_dato != NULL) destruir_dato(valor);
}
free(cola);
}
bool cola_encolar(cola_t *cola, void* valor) {
nodo_t* nodo_nuevo = nodo_crear(valor);
if (nodo_nuevo == NULL) return false;
if (cola_esta_vacia(cola)) {
cola->primero = nodo_nuevo;
} else {
cola->ultimo->prox = nodo_nuevo;
}
cola->ultimo = nodo_nuevo;
return true;
}
void* cola_desencolar(cola_t *cola){
if (cola_esta_vacia(cola)) return NULL;
void* valor = cola_ver_primero(cola);
void* nodo = cola->primero;
cola->primero = cola->primero->prox;
free(nodo);
return valor;
}