Commons Library  1.7.0
Estructuras de datos | Funciones
Referencia del Archivo list.h

#include <commons/collections/list.h> Más...

Ir al código fuente de este archivo.

Estructuras de datos

struct  t_list
 Estructura de una lista enlazada. Inicializar con list_create() Más...
 
struct  t_list_iterator
 Iterador de listas. Inicializar con list_iterator_create() Más...
 

Funciones

t_listlist_create (void)
 Crea una lista. Más...
 
int list_add (t_list *self, void *element)
 Agrega un elemento al final de la lista. Más...
 
void list_destroy (t_list *self)
 Destruye una lista sin liberar los elementos contenidos en los nodos. Más...
 
void list_destroy_and_destroy_elements (t_list *self, void(*element_destroyer)(void *))
 Destruye una lista y sus elementos contenidos llamando a la función element_destroyer sobre cada uno de ellos. Más...
 
void list_add_in_index (t_list *self, int index, void *element)
 Agrega un elemento en una posicion determinada de la lista. Más...
 
int list_add_sorted (t_list *self, void *data, bool(*comparator)(void *, void *))
 Agrega un elemento a una lista ordenada, manteniendo el orden definido por el comparador. Más...
 
void list_add_all (t_list *self, t_list *other)
 Agrega todos los elementos de la segunda lista al final de la primera. Más...
 
void * list_get (t_list *self, int index)
 Retorna el contenido de una posicion determinada de la lista. Más...
 
void * list_get_minimum (t_list *self, void *(*minimum)(void *, void *))
 Retorna el minimo de la lista según el comparador. Más...
 
void * list_get_maximum (t_list *self, void *(*maximum)(void *, void *))
 Retorna el maximo de la lista según el comparador. Más...
 
t_listlist_take (t_list *self, int count)
 Retorna una nueva lista con los primeros n elementos. Más...
 
t_listlist_slice (t_list *self, int start, int count)
 Retorna una nueva lista con los primeros n elementos partiendo desde el índice indicado. Más...
 
t_listlist_take_and_remove (t_list *self, int count)
 Retorna una nueva lista con los primeros n elementos, eliminando del origen estos elementos. Más...
 
t_listlist_slice_and_remove (t_list *self, int start, int count)
 Retorna una nueva lista con los primeros n elementos partiendo desde el índice indicado, eliminando del origen estos elementos. Más...
 
t_listlist_filter (t_list *self, bool(*condition)(void *))
 Retorna una nueva lista con los elementos que cumplen la condicion. Más...
 
t_listlist_map (t_list *self, void *(*transformer)(void *))
 Retorna una nueva lista con los elementos transformados. Más...
 
t_listlist_flatten (t_list *self)
 Retorna una nueva lista con los elementos de la lista de listas recibida. Más...
 
void * list_replace (t_list *self, int index, void *element)
 Coloca un elemento en una de la posiciones de la lista retornando el valor anterior. Más...
 
void * list_replace_by_condition (t_list *self, bool(*condition)(void *), void *element)
 Coloca un elemento en la posición de la lista que cumpla con la condición, retornando el valor anterior. Más...
 
void list_replace_and_destroy_element (t_list *self, int index, void *element, void(*element_destroyer)(void *))
 Coloca un valor en una de la posiciones de la lista liberando el valor anterior. Más...
 
void * list_remove (t_list *self, int index)
 Remueve un elemento de la lista de una determinada posicion y lo retorna. Más...
 
bool list_remove_element (t_list *self, void *element)
 Remueve al elemento de la lista recibido por parámetro. Más...
 
void list_remove_and_destroy_element (t_list *self, int index, void(*element_destroyer)(void *))
 Remueve un elemento de la lista de una determinada posicion y libera la memoria. Más...
 
void * list_remove_by_condition (t_list *self, bool(*condition)(void *))
 Remueve el primer elemento de la lista que haga que condition devuelva true. Más...
 
void list_remove_and_destroy_by_condition (t_list *self, bool(*condition)(void *), void(*element_destroyer)(void *))
 Remueve y libera el primer elemento de la lista que haga que condition devuelva true. Más...
 
void list_remove_and_destroy_all_by_condition (t_list *self, bool(*condition)(void *), void(*element_destroyer)(void *))
 Remueve y destruye todos los elementos de la lista que hagan que condition devuelva true. Más...
 
void list_clean (t_list *self)
 Quita todos los elementos de la lista, sin liberarlos. Más...
 
void list_clean_and_destroy_elements (t_list *self, void(*element_destroyer)(void *))
 Quita todos los elementos de la lista y los libera llamando a la función element_destroyer sobre cada uno de ellos. Más...
 
void list_iterate (t_list *self, void(*closure)(void *))
 Itera la lista llamando al closure por cada elemento. En caso de querer modificar la lista durante la iteración, utilizar list_iterator_create() para recorrerla externamente. Más...
 
void * list_find (t_list *self, bool(*closure)(void *))
 Retorna el primer valor encontrado, el cual haga que condition devuelva true, o NULL en caso de no encontrar ninguno. Más...
 
int list_size (t_list *self)
 Retorna el tamaño de la lista. Más...
 
bool list_is_empty (t_list *self)
 Verifica si la lista esta vacia. Más...
 
void list_sort (t_list *self, bool(*comparator)(void *, void *))
 Ordena la lista segun el comparador. Más...
 
t_listlist_sorted (t_list *self, bool(*comparator)(void *, void *))
 Retorna una lista nueva ordenada segun el comparador. Más...
 
int list_count_satisfying (t_list *self, bool(*condition)(void *))
 Cuenta la cantidad de elementos de la lista que devuelven true al aplicarles la condición. Más...
 
bool list_any_satisfy (t_list *self, bool(*condition)(void *))
 Determina si algún elemento de la lista devuelve true al aplicarle la condición. Más...
 
bool list_all_satisfy (t_list *self, bool(*condition)(void *))
 Determina si todos los elementos de la lista devuelven true al aplicarles la condición. Más...
 
t_listlist_duplicate (t_list *self)
 Crea una lista nueva con los mismos elementos que la original. Más...
 
void * list_fold (t_list *self, void *seed, void *(*operation)(void *, void *))
 Devuelve un valor que resulta de aplicar la operacion entre todos los elementos de la lista, partiendo desde el primero. Más...
 
void * list_fold1 (t_list *self, void *(*operation)(void *, void *))
 Devuelve un valor que resulta de aplicar la operacion entre todos los elementos de la lista, tomando al primero como semilla y partiendo desde el segundo (si existe). Más...
 
t_list_iteratorlist_iterator_create (t_list *list)
 Inicializa una iteración externa de la lista. Permite recorrer la lista y modificarla al mismo tiempo. En caso de no querer modificar la lista ni romper la iteración, considerar utilizar list_iterate(). Más...
 
bool list_iterator_has_next (t_list_iterator *iterator)
 Devuelve true si quedan elementos de la lista por recorrer. Más...
 
void * list_iterator_next (t_list_iterator *iterator)
 Avanza hacia el siguiente elemento a iterar de la lista y lo devuelve. Más...
 
int list_iterator_index (t_list_iterator *iterator)
 Devuelve el índice del elemento actual de la iteración. Más...
 
void list_iterator_add (t_list_iterator *iterator, void *data)
 Agrega a la lista un elemento delante del actual y detrás del siguiente. Luego, avanza hacia el elemento agregado. Más...
 
void list_iterator_remove (t_list_iterator *iterator)
 Remueve de la lista al elemento actual de la iteración. Más...
 
void list_iterator_destroy (t_list_iterator *iterator)
 Finaliza la instancia de iteración externa liberando sus recursos. Más...
 

Descripción detallada

#include <commons/collections/list.h>

Documentación de las funciones

◆ list_create()

t_list* list_create ( void  )

Crea una lista.

Devuelve
Retorna un puntero a la lista creada, liberable con:

Ejemplo de uso:

t_list* people = list_create();
=> people = []
t_list * list_create(void)
Crea una lista.
Estructura de una lista enlazada. Inicializar con list_create()
Definition: list.h:32

◆ list_add()

int list_add ( t_list self,
void *  element 
)

Agrega un elemento al final de la lista.

Parámetros
elementEl elemento a agregar. Este elemento pasará a pertenecer a la lista, por lo que no debe ser liberado por fuera de ésta.
Devuelve
El índice en el que se agregó el elemento

Ejemplo de uso:

t_list* people = list_create();
t_person* person_create(char* name, int age) {
t_person* person = malloc(sizeof(t_person));
person->name = string_duplicate(name);
person->age = age;
return person;
}
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
=> people = [0x1234, 0x5678, 0x9abc]
int list_add(t_list *self, void *element)
Agrega un elemento al final de la lista.
char * string_duplicate(char *original)
Retorna una copia del string pasado como argumento.

◆ list_destroy()

void list_destroy ( t_list self)

Destruye una lista sin liberar los elementos contenidos en los nodos.

Ejemplo de uso:

t_person* messi = person_create("Lionel Messi", 33); // 0x1234
t_person* ronaldo = person_create("Cristiano Ronaldo", 35); // 0x5678
t_person* neymar = person_create("Neymar Jr.", 29); // 0x9abc
t_list* people = list_create();
list_add(people, messi);
list_add(people, ronaldo);
list_add(people, neymar);
list_destroy(people);
=> neymar = 0x9abc
=> ronaldo = 0x5678
=> messi = 0x1234
void list_destroy(t_list *self)
Destruye una lista sin liberar los elementos contenidos en los nodos.

◆ list_destroy_and_destroy_elements()

void list_destroy_and_destroy_elements ( t_list self,
void(*)(void *)  element_destroyer 
)

Destruye una lista y sus elementos contenidos llamando a la función element_destroyer sobre cada uno de ellos.

Nota
En caso de recibir una lista vacía, se comporta como list_destroy().

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
void person_destroy(void* ptr) {
t_person* person = (t_person*) ptr;
free(person->name);
free(person);
}
list_destroy_and_destroy_elements(people, person_destroy);
=> **no hay punteros sin liberar**
void list_destroy_and_destroy_elements(t_list *self, void(*element_destroyer)(void *))
Destruye una lista y sus elementos contenidos llamando a la función element_destroyer sobre cada uno ...

◆ list_add_in_index()

void list_add_in_index ( t_list self,
int  index,
void *  element 
)

Agrega un elemento en una posicion determinada de la lista.

Parámetros
indexLa posicion en la que se quiere agregar el elemento
elementEl elemento a agregar. Este elemento pasará a pertenecer a la lista, por lo que no debe ser liberado por fuera de ésta.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
list_add_in_index(people, 1, person_create("Kylian Mbappé", 22)); // 0xdef0
=> people = [0x1234, 0xdef0, 0x5678, 0x9abc]
void list_add_in_index(t_list *self, int index, void *element)
Agrega un elemento en una posicion determinada de la lista.

◆ list_add_sorted()

int list_add_sorted ( t_list self,
void *  data,
bool(*)(void *, void *)  comparator 
)

Agrega un elemento a una lista ordenada, manteniendo el orden definido por el comparador.

Parámetros
dataEl elemento a agregar. Este elemento pasará a pertenecer a la lista, por lo que no debe ser liberado por fuera de ésta.
comparatorFuncion que compara dos elementos. Debe devolver true si el primer parametro debe aparecer antes que el segundo en la lista

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Kylian Mbappé", 22)); // 0x1234
list_add(people, person_create("Lionel Messi", 33)); // 0x5678
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x9abc
bool _has_age_less_than(void* a, void* b) {
t_person* person_a = (t_person*) a;
t_person* person_b = (t_person*) b;
return person_a->age <= person_b->age;
}
list_add_sorted(people, person_create("Neymar Jr.", 29), _has_age_less_than); // 0xdef0
=> people = [0x1234, 0xdef0, 0x5678, 0x9abc]
int list_add_sorted(t_list *self, void *data, bool(*comparator)(void *, void *))
Agrega un elemento a una lista ordenada, manteniendo el orden definido por el comparador.

◆ list_add_all()

void list_add_all ( t_list self,
t_list other 
)

Agrega todos los elementos de la segunda lista al final de la primera.

Parámetros
selfLa lista a la que se le agregarán los elementos.
otherLa lista de la que se tomarán los elementos. Dichos elementos pasarán a pertenecer a ambas listas a la vez.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
t_list* other_people = list_create();
list_add(other_people, person_create("Neymar Jr.", 29)); // 0x9abc
list_add(other_people, person_create("Kylian Mbappé", 22)); // 0xdef0
list_add_all(people, other_people);
=> people = [0x1234, 0x5678, 0x9abc, 0xdef0]
=> other_people = [0x9abc, 0xdef0]
void list_add_all(t_list *self, t_list *other)
Agrega todos los elementos de la segunda lista al final de la primera.

◆ list_get()

void* list_get ( t_list self,
int  index 
)

Retorna el contenido de una posicion determinada de la lista.

Devuelve
El elemento en la posición index. Este elemento seguirá perteneciendo a la lista, por lo que no debe ser liberado por fuera de ésta.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
t_person* person = list_get(people, 1);
=> person = 0x5678
=> people = [0x1234, 0x5678, 0x9abc]
void * list_get(t_list *self, int index)
Retorna el contenido de una posicion determinada de la lista.

◆ list_get_minimum()

void* list_get_minimum ( t_list self,
void *(*)(void *, void *)  minimum 
)

Retorna el minimo de la lista según el comparador.

Parámetros
minimumFuncion que compara dos elementos. Debe devolver el menor de los dos
Devuelve
El elemento mínimo de la lista. Este elemento seguirá perteneciendo a la lista, por lo que no debe ser liberado por fuera de ésta.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
void* _min_age(void* a, void* b) {
t_person* person_a = (t_person*) a;
t_person* person_b = (t_person*) b;
return person_a->age <= person_b->age ? person_a : person_b;
}
t_person* youngest = list_get_minimum(people, _min_age);
=> youngest = 0x9abc
=> people = [0x1234, 0x5678, 0x9abc]
void * list_get_minimum(t_list *self, void *(*minimum)(void *, void *))
Retorna el minimo de la lista según el comparador.

◆ list_get_maximum()

void* list_get_maximum ( t_list self,
void *(*)(void *, void *)  maximum 
)

Retorna el maximo de la lista según el comparador.

Parámetros
maximumFuncion que compara dos elementos. Debe devolver el mayor de los dos
Devuelve
El elemento máximo de la lista. Este elemento seguirá perteneciendo a la lista, por lo que no debe ser liberado por fuera de ésta.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
void* _max_age(void* a, void* b) {
t_person* person_a = (t_person*) a;
t_person* person_b = (t_person*) b;
return person_a->age >= person_b->age ? person_a : person_b;
}
t_person* oldest = list_get_maximum(people, _max_age);
=> oldest = 0x5678
=> people = [0x1234, 0x5678, 0x9abc]
void * list_get_maximum(t_list *self, void *(*maximum)(void *, void *))
Retorna el maximo de la lista según el comparador.

◆ list_take()

t_list* list_take ( t_list self,
int  count 
)

Retorna una nueva lista con los primeros n elementos.

Parámetros
countCantidad máxima de elementos a tomar.
Devuelve
Una nueva lista con los elementos tomados. Seguirán perteneciendo a la lista original.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
t_list* first_two = list_take(people, 2);
=> first_two = [0x1234, 0x5678]
=> people = [0x1234, 0x5678, 0x9abc]
t_list * list_take(t_list *self, int count)
Retorna una nueva lista con los primeros n elementos.

◆ list_slice()

t_list* list_slice ( t_list self,
int  start,
int  count 
)

Retorna una nueva lista con los primeros n elementos partiendo desde el índice indicado.

Parámetros
startÍndice desde el cual se tomarán los elementos.
countCantidad máxima de elementos a tomar.
Devuelve
Una nueva lista con los elementos tomados. Seguirán perteneciendo a la lista original.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
t_list* last_two = list_slice(people, 1, 2);
=> last_two = [0x5678, 0x9abc]
=> people = [0x1234, 0x5678, 0x9abc]
t_list * list_slice(t_list *self, int start, int count)
Retorna una nueva lista con los primeros n elementos partiendo desde el índice indicado.

◆ list_take_and_remove()

t_list* list_take_and_remove ( t_list self,
int  count 
)

Retorna una nueva lista con los primeros n elementos, eliminando del origen estos elementos.

Parámetros
countCantidad máxima de elementos a tomar.
Devuelve
Una nueva lista con los elementos tomados. Dichos elementos dejarán de pertenecer a la lista original.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
t_list* first_two = list_take_and_remove(people, 2);
=> first_two = [0x1234, 0x5678]
=> people = [0x9abc]
t_list * list_take_and_remove(t_list *self, int count)
Retorna una nueva lista con los primeros n elementos, eliminando del origen estos elementos.

◆ list_slice_and_remove()

t_list* list_slice_and_remove ( t_list self,
int  start,
int  count 
)

Retorna una nueva lista con los primeros n elementos partiendo desde el índice indicado, eliminando del origen estos elementos.

Parámetros
startÍndice desde el cual se tomarán los elementos.
countCantidad máxima de elementos a tomar.
Devuelve
Una nueva lista con los elementos tomados. Dichos elementos dejarán de pertenecer a la lista original.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
t_list* last_two = list_slice_and_remove(people, 1, 2);
=> last_two = [0x5678, 0x9abc]
=> people = [0x1234]
t_list * list_slice_and_remove(t_list *self, int start, int count)
Retorna una nueva lista con los primeros n elementos partiendo desde el índice indicado,...

◆ list_filter()

t_list* list_filter ( t_list self,
bool(*)(void *)  condition 
)

Retorna una nueva lista con los elementos que cumplen la condicion.

Devuelve
Los elementos de la lista retornada seguirán perteneciendo a la lista original.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
bool _has_e(void* ptr) {
t_person* person = (t_person*) ptr;
return string_contains(person->name, "e");
}
t_list* with_e = list_filter(people, _has_e);
=> with_e = [0x1234, 0x9abc]
=> people = [0x1234, 0x5678, 0x9abc]
t_list * list_filter(t_list *self, bool(*condition)(void *))
Retorna una nueva lista con los elementos que cumplen la condicion.
bool string_contains(char *text, char *substring)
Retorna un boolean que indica si text contiene o no a substring.

◆ list_map()

t_list* list_map ( t_list self,
void *(*)(void *)  transformer 
)

Retorna una nueva lista con los elementos transformados.

Devuelve
Los punteros contenidos en la lista retornada serán los devueltos por transformer.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
void* _get_name(void* ptr) {
t_person* person = (t_person*) ptr;
return string_duplicate(person->name);
}
t_list* names = list_map(people, _get_name);
=> names = ["Lionel Messi", "Cristiano Ronaldo", "Neymar Jr."]
=> people = [0x1234, 0x5678, 0x9abc]
t_list * list_map(t_list *self, void *(*transformer)(void *))
Retorna una nueva lista con los elementos transformados.

◆ list_flatten()

t_list* list_flatten ( t_list self)

Retorna una nueva lista con los elementos de la lista de listas recibida.

Devuelve
Los elementos de la lista retornada seguirán perteneciendo a las listas originales.

Ejemplo de uso:

t_list* america = list_create();
list_add(america, person_create("Lionel Messi", 33)); // 0x1234
list_add(america, person_create("Neymar Jr.", 29)); // 0x5678
t_list* europe = list_create();
list_add(europe, person_create("Cristiano Ronaldo", 35)); // 0x9abc
list_add(europe, person_create("Kylian Mbappé", 22)); // 0xdef0
t_list* continents = list_create();
list_add(continents, america);
list_add(continents, europe);
t_list* people = list_flatten(continents);
=> people = [0x1234, 0x5678, 0x9abc, 0xdef0]
=> continents = [[0x1234, 0x5678], [0x9abc, 0xdef0]]
t_list * list_flatten(t_list *self)
Retorna una nueva lista con los elementos de la lista de listas recibida.

◆ list_replace()

void* list_replace ( t_list self,
int  index,
void *  element 
)

Coloca un elemento en una de la posiciones de la lista retornando el valor anterior.

Parámetros
indexLa posicion en la que se quiere agregar el elemento
elementEl elemento a agregar. Este elemento pasará a pertenecer a la lista, por lo que no debe ser liberado por fuera de ésta.
Devuelve
El valor ubicado en la posición index antes de ser reemplazado. Dejará de pertenecer a la lista, por lo que debe ser liberado una vez que no se lo necesite.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
t_person* replaced = list_replace(
people, 1, person_create("Kylian Mbappé", 22)); // 0xdef0
=> replaced = 0x5678
=> people = [0x1234, 0xdef0, 0x9abc]
void * list_replace(t_list *self, int index, void *element)
Coloca un elemento en una de la posiciones de la lista retornando el valor anterior.

◆ list_replace_by_condition()

void* list_replace_by_condition ( t_list self,
bool(*)(void *)  condition,
void *  element 
)

Coloca un elemento en la posición de la lista que cumpla con la condición, retornando el valor anterior.

Parámetros
conditionFunción que recibe un elemento y devuelve true si es el elemento a reemplazar.
elementEl elemento a agregar. Este elemento pasará a pertenecer a la lista, por lo que no debe ser liberado por fuera de ésta.
Devuelve
El valor ubicado en la posición index antes de ser reemplazado, o NULL en caso de no encontrar ningún valor. Dejará de pertenecer a la lista, por lo que debe ser liberado una vez que no se lo necesite.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
bool _has_age_more_than_30(void* ptr) {
t_person* person = (t_person*) ptr;
return person->age > 30;
}
t_person* replaced = list_replace_by_condition(
people, _has_age_more_than_30, person_create("Kylian Mbappé", 22)); // 0xdef0
=> replaced = 0x1234
=> people = [0xdef0, 0x5678, 0x9abc]
void * list_replace_by_condition(t_list *self, bool(*condition)(void *), void *element)
Coloca un elemento en la posición de la lista que cumpla con la condición, retornando el valor anteri...

◆ list_replace_and_destroy_element()

void list_replace_and_destroy_element ( t_list self,
int  index,
void *  element,
void(*)(void *)  element_destroyer 
)

Coloca un valor en una de la posiciones de la lista liberando el valor anterior.

Parámetros
indexLa posicion en la que se quiere agregar el elemento
elementEl elemento a agregar. Este elemento pasará a pertenecer a la lista, por lo que no debe ser liberado por fuera de ésta.
element_destroyerFunción que se encargará de liberar el valor reemplazado.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
people, 1, person_create("Kylian Mbappé", 22), person_destroy); // 0xdef0
=> people = [0x1234, 0xdef0, 0x9abc]
void list_replace_and_destroy_element(t_list *self, int index, void *element, void(*element_destroyer)(void *))
Coloca un valor en una de la posiciones de la lista liberando el valor anterior.

◆ list_remove()

void* list_remove ( t_list self,
int  index 
)

Remueve un elemento de la lista de una determinada posicion y lo retorna.

Parámetros
indexLa posicion del elemento a remover
Devuelve
El elemento removido. Dejará de pertenecer a la lista, por lo que debe ser liberado una vez que no se lo necesite.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
t_person* removed = list_remove(people, 1);
=> removed = 0x5678
=> people = [0x1234, 0x9abc]
void * list_remove(t_list *self, int index)
Remueve un elemento de la lista de una determinada posicion y lo retorna.

◆ list_remove_element()

bool list_remove_element ( t_list self,
void *  element 
)

Remueve al elemento de la lista recibido por parámetro.

Parámetros
elementEl elemento a remover. Al ser removido, ya estaremos seguros de que no pertenece a la lista, por lo que debe ser liberado una vez que no se lo necesite.
Devuelve
true si el elemento fue removido, false en caso de no haber sido encontrado.

Ejemplo de uso:

t_list* people = list_create();
t_person* messi = person_create("Lionel Messi", 33); // 0x1234
list_add(people, messi);
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
bool removed = list_remove_element(people, messi);
=> removed = true
=> people = [0x5678, 0x9abc]
=> messi = 0x1234
bool list_remove_element(t_list *self, void *element)
Remueve al elemento de la lista recibido por parámetro.

◆ list_remove_and_destroy_element()

void list_remove_and_destroy_element ( t_list self,
int  index,
void(*)(void *)  element_destroyer 
)

Remueve un elemento de la lista de una determinada posicion y libera la memoria.

Parámetros
indexLa posicion del elemento a remover
element_destroyerFunción que se encargará de liberar el valor

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
list_remove_and_destroy_element(people, 1, person_destroy);
=> people = [0x1234, 0x9abc]
void list_remove_and_destroy_element(t_list *self, int index, void(*element_destroyer)(void *))
Remueve un elemento de la lista de una determinada posicion y libera la memoria.

◆ list_remove_by_condition()

void* list_remove_by_condition ( t_list self,
bool(*)(void *)  condition 
)

Remueve el primer elemento de la lista que haga que condition devuelva true.

Devuelve
El elemento removido. Dejará de pertenecer a la lista, por lo que debe ser liberado una vez que no se lo necesite.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
bool _has_a(void* ptr) {
t_person* person = (t_person*) ptr;
return string_contains(person->name, "a");
}
t_person* removed = list_remove_by_condition(people, _has_a);
=> removed = 0x5678
=> people = [0x1234, 0x9abc]
void * list_remove_by_condition(t_list *self, bool(*condition)(void *))
Remueve el primer elemento de la lista que haga que condition devuelva true.

◆ list_remove_and_destroy_by_condition()

void list_remove_and_destroy_by_condition ( t_list self,
bool(*)(void *)  condition,
void(*)(void *)  element_destroyer 
)

Remueve y libera el primer elemento de la lista que haga que condition devuelva true.

Parámetros
element_destroyerFunción que se encargará de liberar el valor

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
bool _has_a(void* ptr) {
t_person* person = (t_person*) ptr;
return string_contains(person->name, "a");
}
list_remove_and_destroy_by_condition(people, _has_a, person_destroy);
=> people = [0x1234, 0x9abc]
void list_remove_and_destroy_by_condition(t_list *self, bool(*condition)(void *), void(*element_destroyer)(void *))
Remueve y libera el primer elemento de la lista que haga que condition devuelva true.

◆ list_remove_and_destroy_all_by_condition()

void list_remove_and_destroy_all_by_condition ( t_list self,
bool(*)(void *)  condition,
void(*)(void *)  element_destroyer 
)

Remueve y destruye todos los elementos de la lista que hagan que condition devuelva true.

Parámetros
element_destroyerFunción que se encargará de liberar cada valor

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
bool _has_a(void* ptr) {
t_person* person = (t_person*) ptr;
return string_contains(person->name, "a");
}
list_remove_and_destroy_all_by_condition(people, _has_a, person_destroy);
=> people = [0x1234]
void list_remove_and_destroy_all_by_condition(t_list *self, bool(*condition)(void *), void(*element_destroyer)(void *))
Remueve y destruye todos los elementos de la lista que hagan que condition devuelva true.

◆ list_clean()

void list_clean ( t_list self)

Quita todos los elementos de la lista, sin liberarlos.

Ejemplo de uso:

t_person* messi = person_create("Lionel Messi", 33); // 0x1234
t_person* ronaldo = person_create("Cristiano Ronaldo", 35); // 0x5678
t_person* neymar = person_create("Neymar Jr.", 29); // 0x9abc
t_list* people = list_create();
list_add(people, messi);
list_add(people, ronaldo);
list_add(people, neymar);
list_clean(people);
=> people = []
=> neymar = 0x9abc
=> ronaldo = 0x5678
=> messi = 0x1234
void list_clean(t_list *self)
Quita todos los elementos de la lista, sin liberarlos.

◆ list_clean_and_destroy_elements()

void list_clean_and_destroy_elements ( t_list self,
void(*)(void *)  element_destroyer 
)

Quita todos los elementos de la lista y los libera llamando a la función element_destroyer sobre cada uno de ellos.

Nota
En caso de recibir una lista vacía, se comporta como list_clean().

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33));
list_add(people, person_create("Cristiano Ronaldo", 35));
list_add(people, person_create("Neymar Jr.", 29));
list_clean_and_destroy_elements(people, person_destroy);
=> people = []
void list_clean_and_destroy_elements(t_list *self, void(*element_destroyer)(void *))
Quita todos los elementos de la lista y los libera llamando a la función element_destroyer sobre cada...

◆ list_iterate()

void list_iterate ( t_list self,
void(*)(void *)  closure 
)

Itera la lista llamando al closure por cada elemento. En caso de querer modificar la lista durante la iteración, utilizar list_iterator_create() para recorrerla externamente.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33));
list_add(people, person_create("Cristiano Ronaldo", 35));
list_add(people, person_create("Neymar Jr.", 29));
void print_person(void* ptr) {
t_person* person = (t_person*) ptr;
printf("%s(%d)\n", person->name, person->age);
}
list_iterate(people, print_person);
=> Lionel Messi(33)
Cristiano Ronaldo(35)
Neymar Jr.(29)
void list_iterate(t_list *self, void(*closure)(void *))
Itera la lista llamando al closure por cada elemento. En caso de querer modificar la lista durante la...

◆ list_find()

void* list_find ( t_list self,
bool(*)(void *)  closure 
)

Retorna el primer valor encontrado, el cual haga que condition devuelva true, o NULL en caso de no encontrar ninguno.

Devuelve
El elemento retornado seguirá perteneciendo a la lista, por lo que no debe ser liberado por fuera de ésta.

Ejemplo de uso:

t_person* find_by_name_contains(t_list* people, char* substring) {
bool _name_contains(void* ptr) {
t_person* person = (t_person*) ptr;
return string_contains(person->name, substring);
}
return list_find(people, _name_contains);
}
t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
t_person* a = find_by_name_contains(people, "a");
t_person* x = find_by_name_contains(people, "x");
=> a = 0x5678
=> x = NULL
=> people = [0x1234, 0x5678, 0x9abc]
void * list_find(t_list *self, bool(*closure)(void *))
Retorna el primer valor encontrado, el cual haga que condition devuelva true, o NULL en caso de no en...

◆ list_size()

int list_size ( t_list self)

Retorna el tamaño de la lista.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
int size = list_size(people);
=> size = 3
=> people = [0x1234, 0x5678, 0x9abc]
int list_size(t_list *self)
Retorna el tamaño de la lista.

◆ list_is_empty()

bool list_is_empty ( t_list self)

Verifica si la lista esta vacia.

Ejemplo de uso:

t_list* people = list_create();
bool is_empty = list_is_empty(people);
=> is_empty = true
=> people = []
bool list_is_empty(t_list *self)
Verifica si la lista esta vacia.

◆ list_sort()

void list_sort ( t_list self,
bool(*)(void *, void *)  comparator 
)

Ordena la lista segun el comparador.

Parámetros
comparatorFuncion que compara dos elementos. Debe devolver true si el primer parametro debe aparecer antes que el segundo en la lista

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
bool _has_age_less_than(void* a, void* b) {
t_person* person_a = (t_person*) a;
t_person* person_b = (t_person*) b;
return person_a->age <= person_b->age;
}
list_sort(people, _has_age_less_than);
=> people = [0x9abc, 0x1234, 0x5678]
void list_sort(t_list *self, bool(*comparator)(void *, void *))
Ordena la lista segun el comparador.

◆ list_sorted()

t_list* list_sorted ( t_list self,
bool(*)(void *, void *)  comparator 
)

Retorna una lista nueva ordenada segun el comparador.

Parámetros
comparatorFuncion que compara dos elementos. Debe devolver true si el primer parametro debe aparecer antes que el segundo en la lista
Devuelve
La lista ordenada. Los elementos de la lista retornada seguirán perteneciendo a la lista original.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
bool _has_age_less_than(void* a, void* b) {
t_person* person_a = (t_person*) a;
t_person* person_b = (t_person*) b;
return person_a->age <= person_b->age;
}
t_list* sorted = list_sorted(people, _has_age_less_than);
=> sorted = [0x9abc, 0x1234, 0x5678]
=> people = [0x1234, 0x5678, 0x9abc]
t_list * list_sorted(t_list *self, bool(*comparator)(void *, void *))
Retorna una lista nueva ordenada segun el comparador.

◆ list_count_satisfying()

int list_count_satisfying ( t_list self,
bool(*)(void *)  condition 
)

Cuenta la cantidad de elementos de la lista que devuelven true al aplicarles la condición.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
bool _has_a(void* ptr) {
t_person* person = (t_person*) ptr;
return string_contains(person->name, "a");
}
int count = list_count_satisfying(people, _has_a);
=> count = 2
=> people = [0x1234, 0x5678, 0x9abc]
int list_count_satisfying(t_list *self, bool(*condition)(void *))
Cuenta la cantidad de elementos de la lista que devuelven true al aplicarles la condición.

◆ list_any_satisfy()

bool list_any_satisfy ( t_list self,
bool(*)(void *)  condition 
)

Determina si algún elemento de la lista devuelve true al aplicarle la condición.

Ejemplo de uso:

bool people_any_contains(t_list* self, char* substring) {
bool _contains_substring(void* ptr) {
t_person* person = (t_person*) ptr;
return string_contains(person->name, substring);
}
return list_any_satisfy(self, _contains_substring);
}
t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
bool has_a = people_any_contains(people, "a");
bool has_x = people_any_contains(people, "x");
=> has_a = true
=> has_x = false
=> people = [0x1234, 0x5678, 0x9abc]
bool list_any_satisfy(t_list *self, bool(*condition)(void *))
Determina si algún elemento de la lista devuelve true al aplicarle la condición.

◆ list_all_satisfy()

bool list_all_satisfy ( t_list self,
bool(*)(void *)  condition 
)

Determina si todos los elementos de la lista devuelven true al aplicarles la condición.

Ejemplo de uso:

bool people_all_have_age_greater_than(t_list* self, int age) {
bool _has_age_greater_than(void* ptr) {
t_person* person = (t_person*) ptr;
return person->age > age;
}
return list_all_satisfy(self, _has_age_greater_than);
}
t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
bool all_greater_than_25 = people_all_have_age_greater_than(people, 25);
bool all_greater_than_30 = people_all_have_age_greater_than(people, 30);
=> all_greater_than_25 = true
=> all_greater_than_30 = false
=> people = [0x1234, 0x5678, 0x9abc]
bool list_all_satisfy(t_list *self, bool(*condition)(void *))
Determina si todos los elementos de la lista devuelven true al aplicarles la condición.

◆ list_duplicate()

t_list* list_duplicate ( t_list self)

Crea una lista nueva con los mismos elementos que la original.

Devuelve
La lista duplicada. Los elementos de la lista retornada seguirán perteneciendo a la lista original.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
t_list* people_copy = list_duplicate(people);
=> people = [0x1234, 0x5678]
=> people_copy = [0x1234, 0x5678]
t_list * list_duplicate(t_list *self)
Crea una lista nueva con los mismos elementos que la original.

◆ list_fold()

void* list_fold ( t_list self,
void *  seed,
void *(*)(void *, void *)  operation 
)

Devuelve un valor que resulta de aplicar la operacion entre todos los elementos de la lista, partiendo desde el primero.

Parámetros
seedValor inicial para el primer parámetro de la operación.
operationFuncion que recibe dos valores: El primero es el resultado de la operación anterior y el segundo es el siguiente elemento de la lista. Debe devolver un valor del mismo tipo que el inicial.
Devuelve
El resultado de aplicar la operación al último elemento de la lista.

Ejemplo de uso:

t_list* people = list_create();
list_add(people, person_create("Lionel Messi", 33)); // 0x1234
list_add(people, person_create("Cristiano Ronaldo", 35)); // 0x5678
list_add(people, person_create("Neymar Jr.", 29)); // 0x9abc
void *_append_person(char* acc, void* ptr) {
t_person* person = (t_person*) ptr;
if (!string_is_empty(acc)) {
string_append(&acc, ", ");
}
string_append_with_format(&acc, "%s(%d)", person->name, person->age);
return acc;
}
char* str = list_fold(people, string_new(), _append_person);
=> str = "Lionel Messi(33), Cristiano Ronaldo(35), Neymar Jr.(29)"
=> people = [0x1234, 0x5678, 0x9abc]
void * list_fold(t_list *self, void *seed, void *(*operation)(void *, void *))
Devuelve un valor que resulta de aplicar la operacion entre todos los elementos de la lista,...
void string_append_with_format(char **original, const char *format,...)
Concatena al primer string el resultado de aplicar los parametros al formato especificado.
char * string_new(void)
Crea un string vacio.
void string_append(char **original, char *string_to_add)
Agrega al primer string el segundo.
bool string_is_empty(char *text)
Retorna si un string es "".

◆ list_fold1()

void* list_fold1 ( t_list self,
void *(*)(void *, void *)  operation 
)

Devuelve un valor que resulta de aplicar la operacion entre todos los elementos de la lista, tomando al primero como semilla y partiendo desde el segundo (si existe).

Parámetros
operationFuncion que recibe dos valores del tipo de los elementos de la lista y devuelve otro valor del mismo tipo.
Devuelve
El resultado de aplicar la operación al último elemento de la lista.

Ejemplo de uso:

t_list* names = list_create();
list_add(names, string_duplicate("Lionel Messi")); // 0x1234
list_add(names, string_duplicate("Cristiano Ronaldo")); // 0x5678
list_add(names, string_duplicate("Neymar Jr.")); // 0x9abc
void* _longest_name(void* ptr1, void* ptr2) {
char* name1 = (char*) ptr1;
char* name2 = (char*) ptr2;
return string_length(name1) > string_length(name2) ? name1 : name2;
}
char* longest_name = list_fold1(names, _longest_name);
=> longest_name = "Cristiano Ronaldo"
=> names = [0x1234, 0x5678, 0x9abc]
void * list_fold1(t_list *self, void *(*operation)(void *, void *))
Devuelve un valor que resulta de aplicar la operacion entre todos los elementos de la lista,...
int string_length(char *text)
Retorna la longitud del string.

◆ list_iterator_create()

t_list_iterator* list_iterator_create ( t_list list)

Inicializa una iteración externa de la lista. Permite recorrer la lista y modificarla al mismo tiempo. En caso de no querer modificar la lista ni romper la iteración, considerar utilizar list_iterate().

Devuelve
Un puntero que debe ser liberado con list_iterator_destroy() una vez finalizada la iteración.

Ejemplo de uso:

while(list_iterator_has_next(iterator)) {
void* element = list_iterator_next(iterator);
// Hacer algo que requiera list_iterator_add() o list_iterator_remove()
// o romper la iteración con break o return
}
t_list_iterator * list_iterator_create(t_list *list)
Inicializa una iteración externa de la lista. Permite recorrer la lista y modificarla al mismo tiempo...
bool list_iterator_has_next(t_list_iterator *iterator)
Devuelve true si quedan elementos de la lista por recorrer.
void * list_iterator_next(t_list_iterator *iterator)
Avanza hacia el siguiente elemento a iterar de la lista y lo devuelve.
void list_iterator_destroy(t_list_iterator *iterator)
Finaliza la instancia de iteración externa liberando sus recursos.
Iterador de listas. Inicializar con list_iterator_create()
Definition: list.h:41

◆ list_iterator_has_next()

bool list_iterator_has_next ( t_list_iterator iterator)

Devuelve true si quedan elementos de la lista por recorrer.

◆ list_iterator_next()

void* list_iterator_next ( t_list_iterator iterator)

Avanza hacia el siguiente elemento a iterar de la lista y lo devuelve.

Devuelve
El elemento actual de la iteración. Pertenecerá a la lista, por lo que no debe ser liberado por fuera de ésta a menos que se lo remueva con list_iterator_remove().

◆ list_iterator_index()

int list_iterator_index ( t_list_iterator iterator)

Devuelve el índice del elemento actual de la iteración.

◆ list_iterator_add()

void list_iterator_add ( t_list_iterator iterator,
void *  data 
)

Agrega a la lista un elemento delante del actual y detrás del siguiente. Luego, avanza hacia el elemento agregado.

Parámetros
dataEl elemento a agregar. Este elemento pasará a pertenecer a la lista, por lo que no debe ser liberado por fuera de ésta.

◆ list_iterator_remove()

void list_iterator_remove ( t_list_iterator iterator)

Remueve de la lista al elemento actual de la iteración.

Nota
El elemento removido es el último devuelto por list_iterator_next() y dejará de pertenecer a la lista, por lo que debe ser liberado una vez que no se lo necesite.

◆ list_iterator_destroy()

void list_iterator_destroy ( t_list_iterator iterator)

Finaliza la instancia de iteración externa liberando sus recursos.

Nota
Esta operación no libera la lista ni sus elementos.