-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlist.h
208 lines (151 loc) · 4.84 KB
/
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
/**
MIT License
Copyright (c) 2018 Matias Barrientos.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#ifndef list_h
#define list_h
typedef struct list list;
/**
@typedef
Prototipo de funcion para eliminar de memoria el objeto que se guarda dentro de la lista.
@param object Puntero al objecto guardado.
*/
typedef void (*list_release_object_callback)(void *object);
/**
Crea un nuevo puntero de tipo List.
@return Puntero a la nueva List.
*/
extern list *list_create (list_release_object_callback release);
/**
Crea un nuevo puntero de tipo List.
@return Puntero a la nueva List.
*/
extern list *list_create_empty (void);
/**
Devuele el primer dato de la List.
Complejidad: O(1)
@param list Puntero a la List.
@return Puntero al dato contenido en la cabeza.
*/
extern void *list_first (list *list);
/**
Devuele el siguiente dato de la List.
Complejidad: O(1)
@param list Puntero a la List.
@return Puntero al dato.
Ejemplo:
@code
void *data = list_first(list);
while (data != NULL) {
// Aqui puede manipular el dato o imprimirlo.
data = list_next(list);
}
*/
extern void *list_next (list *list);
/**
Devuelve el ultimo dato de la List.
Complejidad: O(1)
@param list Puntero a la List.
@return Puntero al dato.
*/
extern void *list_last (list *list);
/**
Devuele el anterior dato de la List.
Complejidad: O(1)
@param list Puntero a la List.
@return Puntero al dato.
@code
void *data = list_last(list);
while (data != NULL) {
// Aqui puede manipular el dato o imprimirlo.
data = list_prev(list);
}
*/
extern void *list_prev (list *list);
/**
Cantidad de elementos en la List.
Complejidad: O(1)
@param list Puntero a la List.
@return Cantidad de elementos en la List.
*/
extern long list_size (list *list);
/**
Prueba si la List está vacía.
Complejidad: O(1)
@param list Puntero a la List.
@return 1 (true) si y solo si la List no contiene elementos; 0 (false) lo contrario.
*/
extern int list_empty (list *list);
/**
Inserta un elemento en al inicio de la List.
Complejidad: O(1)
@param list Puntero a la List.
@param data Puntero al dato que se quiere guardar.
*/
extern void list_push_front (list *list, const void *data);
/**
Inserta un elemento al final de la lista.
Complejidad: O(1)
@param list Puntero a la List.
@param data Puntero al dato que se quiere guardar.
*/
extern void list_push_back (list *list, const void *data);
/**
Inserta un elemento despues del current. El current se actualiza cuando se reccore la lista con las funciones firstList, etc.
Complejidad: O(1)
@param list Puntero a la List.
@param data Puntero al dato que se quiere guardar.
*/
extern void list_push_current (list *list, const void *data);
/**
Elimina el nodo del inicio de la lista,
si esta activada la funcion release, esta eliminara
de la memoria el puntero que apunta hacia el objeto.
Complejidad: O(1)
@param list Puntero a la List.
@return Puntero del dato eliminado.
*/
extern void *list_pop_front (list *list);
/**
Elimina el nodo final de la lista,
si esta activada la funcion release, esta eliminara
de la memoria el puntero que apunta hacia el objeto.
Complejidad: O(1)
@param list Puntero a la List.
@return Puntero del dato eliminado.
*/
extern void *list_pop_back (list *list);
/**
Elimina el nodo en donde se encuentre el current,
actualiza el current al siguiente de este.
Si esta activada la funcion release, esta eliminara
de la memoria el puntero que apunta hacia el objeto.
Complejidad: O(1)
@param list Puntero a la List.
@return Puntero del dato eliminado.
*/
extern void *list_pop_current (list *list);
/**
Elimina todos los nodos de la lista,
si esta activada la funcion release, esta eliminara
de la memoria el puntero que apunta hacia el objeto.
Complejidad: O(n)
@param list Puntero a la List.
*/
extern void list_release (list **list);
#endif /* list_h */