-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvector-list.h
260 lines (225 loc) · 7.34 KB
/
vector-list.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
/*
* Licencia Apache, Versión 2.0 con Modificación
*
* Copyright 2023 Desmon (David)
*
* Se concede permiso, de forma gratuita, a cualquier persona que obtenga una copia de
* este software y archivos de documentación asociados (el "Software"), para tratar el
* Software sin restricciones, incluidos, entre otros, los derechos de uso, copia,
* modificación, fusión, publicación, distribución, sublicencia y/o venta de copias del
* Software, y para permitir a las personas a quienes se les proporcione el Software
* hacer lo mismo, sujeto a las siguientes condiciones:
*
* El anterior aviso de copyright y este aviso de permiso se incluirán en todas las
* copias o partes sustanciales del Software.
*
* EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O
* IMPLÍCITA, INCLUYENDO PERO NO LIMITADO A LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD
* PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS TITULARES DEL
* COPYRIGHT O LOS TITULARES DE LOS DERECHOS DE AUTOR SERÁN RESPONSABLES DE NINGÚN
* RECLAMO, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN DE CONTRATO, AGRAVIO O DE
* OTRA MANERA, QUE SURJA DE, FUERA DE O EN CONEXIÓN CON EL SOFTWARE O EL USO U OTRO TIPO
* DE ACCIONES EN EL SOFTWARE.
*
* Además, cualquier modificación realizada por terceros se considerará propiedad del
* titular original de los derechos de autor. Los titulares de derechos de autor
* originales no se responsabilizan de las modificaciones realizadas por terceros.
*
* Queda explícitamente establecido que no es obligatorio especificar ni notificar los
* cambios realizados entre versiones, ni revelar porciones específicas de código
* modificado.
*/
#ifndef __VECTOR_LIST_H__
#define __VECTOR_LIST_H__
#include <stdbool.h>
#include "array-list.h"
#define get_element(type, name, posicion) \
get_val(type, get_element_v(name, posicion))
typedef struct Node
{
position id;
void *data;
struct Node *next;
} Node;
typedef struct
{
Node *head;
position lastId;
} LinkedList;
#ifdef push_back
#undef push_back
#define push_back(array, ...) _Generic((array), \
ArrayList*: push_back_a, \
LinkedList*: push_back_v, \
default: push_back_a)(array,__VA_ARGS__)
#endif
#ifdef pop_back
#undef pop_back
#define pop_back(list) _Generic((list), \
ArrayList*: pop_back_a, \
LinkedList*: pop_back_v)(list)
#endif
#ifdef size
#undef size
#define size(list) _Generic((list), \
ArrayList*: size_a, \
LinkedList*: size_v)(list)
#endif
#ifndef back
#define back(list) _Generic((list), \
ArrayList*: back_a, \
LinkedList*: back_v)(list)
#endif
static LinkedList *table_matriz_ = NULL;
// Declaración de funciones de inicialización y finalización
void __attribute__((constructor)) __constructor_array_dinamic__();
void __attribute__((destructor)) __destructor_array_dinamic__();
// Declaración de funciones de la lista enlazada
/**
* Crea una nueva lista enlazada vacía.
*
* @return Puntero a la lista enlazada creada.
*/
LinkedList *createLinkedList();
/**
* Obtiene un nodo de la lista enlazada en la posición dada.
*
* @param list Lista enlazada.
* @param pos Posición del nodo a obtener.
* @return Puntero al nodo solicitado, o NULL si no se encuentra.
*/
Node *get_node(LinkedList *list, const position pos);
/**
* Obtiene el último nodo de la lista enlazada.
*
* @param list Lista enlazada.
* @return Puntero al último nodo de la lista, o NULL si la lista está vacía.
*/
Node *get_last_node(LinkedList *list);
/**
* Elimina todos los nodos de la lista enlazada y libera la memoria.
*
* @param list Lista enlazada a limpiar.
*/
void clear(LinkedList *list);
/**
* Inserta un nuevo nodo con el dato proporcionado al final de la lista enlazada.
*
* @param list Lista enlazada.
* @param data Dato a insertar en el nuevo nodo.
*/
void insertNode(LinkedList *list, void *data);
/**
* Elimina el nodo especificado de la lista enlazada.
*
* @param list Lista enlazada.
* @param node Nodo a eliminar.
*/
void deleteNode(LinkedList *list, Node *node);
/**
* Elimina el nodo con el ID especificado de la lista enlazada.
*
* @param list Lista enlazada.
* @param ID ID del nodo a eliminar.
*/
int deleteNodeID(LinkedList *list, const position ID);
/**
* Actualiza los IDs de los nodos en la lista enlazada después de eliminar un nodo.
*
* @param list Lista enlazada.
*/
void updateIds(LinkedList *list);
/**
* Imprime los IDs de los nodos en la lista enlazada.
*
* @param list Lista enlazada a imprimir.
*/
void printLinkedList(LinkedList *list);
/**
* Libera la memoria utilizada por la lista enlazada y elimina los nodos de table_matriz_.
*
* @param list Lista enlazada a liberar.
*/
void freeLinkedList(LinkedList *list);
/**
* Obtiene el dato almacenado en el nodo con el ID especificado.
*
* @param list Lista enlazada.
* @param ID ID del nodo.
* @return Puntero al dato almacenado en el nodo, o NULL si no se encuentra.
*/
void *get_element_v(LinkedList *list, const position ID);
/**
* Obtiene el dato almacenado en el último nodo de la lista enlazada.
*
* @param list Lista enlazada.
* @return Puntero al dato almacenado en el último nodo, o NULL si la lista está vacía.
*/
void *get_last(LinkedList *list);
/**
* Obtiene la posición del último nodo de la lista enlazada.
*
* @param list Lista enlazada.
* @return Posición del último nodo, o -1 si la lista está vacía.
*/
const position get_last_position(LinkedList *list);
/**
* Verifica si un nodo dado existe en la lista enlazada.
*
* @param list Lista enlazada.
* @param node Nodo a buscar.
* @return true si el nodo existe en la lista, false en caso contrario.
*/
bool exists(LinkedList *list, Node *node);
/**
* Verifica si un nodo con el ID dado existe en la lista enlazada.
*
* @param list Lista enlazada.
* @param ID ID del nodo a buscar.
* @return true si el nodo con el ID dado existe en la lista, false en caso contrario.
*/
bool existsID(LinkedList *list, const position ID);
/**
* Verifica si la lista enlazada está vacía.
*
* @param list Lista enlazada.
* @return true si la lista está vacía, false en caso contrario.
*/
bool empty(LinkedList *list);
/**
* Inserta un nuevo nodo con el dato proporcionado al final de la lista enlazada y devuelve su posición.
*
* @param list Lista enlazada.
* @param data Dato a insertar en el nuevo nodo.
* @return Posición del nuevo nodo insertado.
*/
const position push_back_v(LinkedList *list, void *data);
/**
* Elimina el último nodo de la lista enlazada y devuelve su posición.
*
* @param list Lista enlazada.
* @return Posición del nodo eliminado, o -1 si la lista está vacía.
*/
const position pop_back_v(LinkedList *list);
/**
* Obtiene la cantidad de nodos en la lista enlazada.
*
* @param list Lista enlazada.
* @return Cantidad de nodos en la lista.
*/
const position size_v(LinkedList *list);
/**
* Obtiene la posición del nodo especificado en la lista enlazada.
*
* @param node Nodo a obtener la posición.
* @return Posición del nodo, o -1 si el nodo no pertenece a ninguna lista.
*/
const position get_position(Node *node);
/**
* Libera la memoria utilizada por todos los vectores en la lista enlazada table_matriz_.
*/
void free_all_vector();
#ifdef INCLUDE_COLORS_C
#include "vector-list.c"
#endif
#endif