diff --git a/include/containers/vector.h b/include/containers/vector.h new file mode 100644 index 0000000..1ccd0b6 --- /dev/null +++ b/include/containers/vector.h @@ -0,0 +1,21 @@ +#ifndef VECTOR_H +#define VECTOR_H + +#include + +typedef struct { + void* data; // Puntero a buffer genérico + size_t size; // Cantidad de elementos actualmente en el vector + size_t capacity; // Capacidad total del vector + size_t element_size; // Tamaño de cada elemento +} Vector; + +void vector_init(Vector* v, size_t element_size, size_t initial_capacity); +void vector_push_back(Vector* v, const void* element); +void vector_pop_back(Vector* v); +void *vector_get(Vector* v, size_t index); +size_t vector_size(Vector* v); +size_t vector_capacity(Vector* v); +void vector_free(Vector* v); + +#endif diff --git a/include/framework.h b/include/framework.h index dfad6a3..2bea78a 100644 --- a/include/framework.h +++ b/include/framework.h @@ -11,6 +11,7 @@ #endif // Terminamos la definición // Contenedores +#include "containers/vector.h" // Arreglo dinámico // Algoritmos diff --git a/src/containers/vector.c b/src/containers/vector.c new file mode 100644 index 0000000..dc746ad --- /dev/null +++ b/src/containers/vector.c @@ -0,0 +1,36 @@ +#include "pch.h" +#include "containers/vector.h" +#include + +void vector_init(Vector* v, size_t element_size, size_t initial_capacity) { + v->data = malloc(element_size * initial_capacity); + if (!v->data) { + // Manejo de error de asignación de memoria + v->size = 0; + v->capacity = 0; + v->element_size = 0; + return; + } + v->size = 0; + v->capacity = initial_capacity; + v->element_size = element_size; +} + +void vector_push_back(Vector* v, const void* element) { + if (v->size == v->capacity) { + // Si está lleno, aumentamos la capacidad + size_t new_capacity = v->capacity == 0 ? 1 : v->capacity * 2; + void* new_data = realloc(v->data, v->element_size * new_capacity); + if (!new_data) { + // En caso de error de realloc, imprimimos un mensaje y salimos + fprintf(stderr, "Error: No se pudo asignar memoria en push_back, elemento no agregado\n"); + return; + } + v->data = new_data; + v->capacity = new_capacity; + } + + // Copiamos el nuevo elemento al final del vector + memcpy((char*)v->data + v->size * v->element_size, element, v->element_size); + v->size++; +}