-
Notifications
You must be signed in to change notification settings - Fork 0
/
almacenamiento.h
290 lines (249 loc) · 8 KB
/
almacenamiento.h
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
#ifndef STD
#define STD
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#define TRUE 1
#define FALSE 0
#define TAMAX 10
#endif
/*INICIO definición del tipo HashLote*/
/**
* Híbrido entre lista y arreglos, basicamente es una lista enlazada de
* arreglos, que utilizaremos para almacenar elementos que estén relacionados
* con la posición que ocupan, para luego poder ubicarlos facilmente y
* agilizar la búsqueda. Una posición se considera ocupada si su contenido es
* diferente de cero (0). De ahi que no se haya implementado la función que
* elimine el contenido de una posición; basta con insertar el elemento cero (0)
* en la posición cuyo contenido se desee eliminar.
*
* trozo: Arreglo que guarda lo correspondiente a un rango de tamaño TAMAX y
* representa las posiciones compendidas entre 'ini' y ('ini' + TAMAX -1)
* inclusive.
*
* ini: Entero que representa el comienzo del rango de este Segmento.
*
* size: Entero que representa cuántas casillas hay ocupadas en este Segmento.
*
* *ant: Apuntador al Segmento anterior.
*
* *sig: Apuntador al siguiente Segmento.
*
*/
typedef struct segmento Segmento;
struct segmento {
int trozo[TAMAX], ini, size;
Segmento *ant, *sig;
};
/**
* Acceso rápido a la cabeza y cola de la lista de Segmentos.
*
* *head: Apuntador al primer Segmento de este HashLote.
*
* *tail: Apuntador al último Segmento de este HashLote.
*
* size: Entero que dice cuántas casillas hay ocupadas.
*/
typedef struct {
Segmento *head,*tail;
int size;
} HashLote;
/*FIN del tipo HashLote*/
/*----------------------------------------------------------------------------*/
/*INICIO Funciones y Procedimientos referentes al tipo hashLote*/
/**
* Constructor del tipo Segmento. Se encarga de hacer la reserva de memoria y de
* inicializar los campos convenientemente. El contenido del arreglo (trozo) se
* inicializa en 0.
*
* retorna: un apuntador a Segmento nuevo, inicializado, con su correspondiente
* reserva de memoria.
*/
Segmento *newSegmento();
/**
* Constructor del tipo HashLote. Se encarga de hacer la reserva de memoria.
*
* retorna: un nuevo apuntador a HashLote con su correspondiente reserva de
* memoria.
*/
HashLote *newHashLote();
/**
* Sirve para calcular el Segmento al que corresponde la posicion pasada como
* argumento.
*
* pos: posición a la cual se le quiere calcular el rango.
*
* retorna: Entero que indica el inicio del rango al que corresponde 'pos'.
* El final del rango es calculable sumando (x + (TAMAX - 1)), donde
* 'x' es el número devuelto por esta función.
*/
int calcRango(int pos);
/**funcion a ser utilizada solo si existe un unico elemento en el HashLote
*que devuelve la posicion del elemento
*/
int unico(HashLote *lote);
/**
* Calcula la posicion interna dentro de un Segmento donde debe ir 'pos'
*
* pos: posición a la cual se le calcula la posición interna en el trozo de
* HashLote.
*
* retorna: Posición interna en el arreglo del segmento al cual corresponde la
* posición 'pos'.
*/
int calcPosicion(int pos);
/**
* Inserta el numero 'num' en la posición 'pos' del HashLote '*lote'.
*
* *lote: apuntador al lote donde se desea hacer la inserción.
*
* pos: posición en la que se desea insertar.
*
* num: número a insertar en el HashLote.
*
* retorna: Un entero que indica el estado de la inserción; 0 si fue realizada
* con éxito, cualquier otro número en caso contrario.
*/
int insertar(HashLote *lote, int pos, int num);
/**
* Devuelve el elemento almacenado en la posición 'pos', en el HashLote 'lote'.
*
* *lote: apuntador al lote donde se buscará el elemento.
*
* pos: posición que se desea buscar en el HashLote *lote.
*
* retorna: el elemento en el HashLote '*lote' en la posición 'pos', en caso de
* estar. Devuelve 0 si el elemento en la posición 'pos' no ha sido
* asignado; y -1 en caso de que el segmento correspondiente a la
* posición buscada no exista.
*/
int get(HashLote *lote, int pos);
/**
* Dice si el elemento en la posición 'pos' ha sido insertado en el HashLote
* '*lote'.
* *lote: apuntador al lote donde se buscará el elemento.
*
* pos: posición que se desea buscar en el HashLote *lote.
*
* retorna: 1 en caso de que el elemento en la posición 'pos' haya sido asignado;
* 0 en caso contrario.
*/
int contiene(HashLote *lote, int pos);
/**
* Imprime en la salida estándar el contenido útil del HashLote 'lote'.
*
* lote: El HashLote que se desea imprimir por la salida estándar.
*/
void hl_print(HashLote lote);
/**
* Se encarga de devolver un HashLote a su estado original vacío, liberando la
* memoria consumida por éste. El apuntador Lote queda apuntando a una lista
* vacía.
*
* lote: Un apuntador al HashLote que se desea limpiar.
*
* retorna: 0 si se completó la limpieza con éxito, 1 en caso contrario.
*/
int hl_liberar(HashLote *lote);
/**
* Se encarga de devolver un Segmento a su estado original vacío, liberando la
* memoria consumida por éste.
*
* lote: Un apuntador al Segmento que se desea limpiar.
*
* retorna: 0 si se completó la limpieza con éxito, 1 en caso contrario.
*/
int seg_liberar(HashLote *lote, Segmento *segm);
/**
* Devuelve un arreglo que contiene todos los elementos del HashLote 'lote'.
*
* lote: El HashLote a transferir a arreglo.
*
*/
int *hltoArray(HashLote *lote);
/**
* Devuelve un arreglo que contiene todas las posiciones ocupadas en
* el HashLote 'lote' por los elementos almacenados.
* lote: El HashLote a transferir a arreglo.
*
*/
int *posToArray(HashLote *lote);
/*FIN Funciones y Procedimientos referentes al tipo HashLote*/
/*----------------------------------------------------------------------------*/
/*INICIO definición del tipo ListaInt.*/
/**
* Clasica lista de elementos. Es una lista de apuntadores a void, con lo cual
* se podra almacenar practicamente cualquier cosa.
*/
typedef struct cajitaInt CajitaInt;
struct cajitaInt {
int data;
CajitaInt *sig,*ant;
};
typedef struct {
CajitaInt *head,*tail;
int size;
} ListaInt;
/*FIN del tipo ListaInt.*/
/*INICIO Funciones y Procedimientos referentes al tipo ListaInt*/
/**
* Crea una nueva Cajita, reservando la memoria necesaria para ello.
*
* retorna: Un nuevo apuntador a Cajita vacía.
*/
CajitaInt *newCajitaInt();
/**
* Crea una nueva lista vacía, reservando la memoria necesaria para ello.
*
* retorna: un nuevo apuntador a una lista vacía.
*/
ListaInt *newListaInt();
/**
* Inserta el elemento 'elem' en la Lista '*list'
*
* *list: apuntador a la Lista donde se desea hacer la inserción.
*
* elem: elemento a insertar en la Lista.
*
* retorna: Un entero que indica el estado de la inserción; 0 si fue realizada
* con éxito, 1 en caso contrario.
*/
int add(ListaInt *list, int elem);
/**
* Elimina el elemento 'elem' en la Lista '*list'
*
* *list: apuntador a la Lista donde se desea hacer la eliminación.
*
* elem: elemento a eliminar de la Lista.
*/
void delete(ListaInt *list, int elem);
/**
* Dice si un elemento 'elem' está actualmente o no en la Lista '*list'.
*
* *list: apuntador a la Lista donde se desea hacer la búsqueda.
*
* elem: elemento a buscar en la Lista.
*
* retorna: Un entero que indica el estado de la búsqueda; 1 si se encontró el
* elemento, 1 en caso contrario.
*/
int isIn(ListaInt *list, int elem);
/**
* Imprime en la salida estándar la ListaInt 'lista'.
*
* lista: ListaInt a imprimir.
*/
void li_print(ListaInt lista);
/**
* Se encarga de devolver una ListaInt a su estado original vacía, liberando la
* memoria consumida por ésta.
*
* lote: Un apuntador a la ListaInt que se desea liberar.
*
* retorna: 0 si se completó la limpieza con éxito, 1 en caso contrario.
*/
int li_liberar(ListaInt *lista);
/*FIN Funciones y Procedimientos referentes al tipo ListaInt*/
/*----------------------------------------------------------------------------*/
/*FIN DEL ARCHIVO (EOF)*/