#include "vector.h" #include #include struct vector *vector_init(size_t n) { struct vector *res = malloc(sizeof(struct vector)); if (res == NULL) { return NULL; } res->size = 0; res->capacity = n; res->data = malloc(n * sizeof(int)); if (res->data == NULL) { return NULL; } return res; } void vector_destroy(struct vector *v) { if (v) { free(v->data); free(v); } } struct vector *vector_resize(struct vector *v, size_t n) { if (!v) { return NULL; } if (n == v->capacity) { return v; } if (v) { int *tmp = realloc(v->data, n * sizeof(int)); if (tmp == NULL) { return NULL; } v->data = tmp; if (n < v->size) { v->size = n; } v->capacity = n; return v; } return NULL; } struct vector *vector_append(struct vector *v, int elt) { if (v == NULL) { return NULL; } if (v->size == v->capacity) { if (vector_resize(v, v->capacity * 2) == NULL) { return NULL; } } v->data[v->size] = elt; v->size++; return v; } void vector_print(const struct vector *v) { if (v == NULL || v->size == 0) { printf("\n"); return; } for (size_t i = 0; i < v->size - 1; i++) { printf("%d,", v->data[i]); } printf("%d\n", v->data[v->size - 1]); } struct vector *vector_reset(struct vector *v, size_t n) { if (vector_resize(v, n) == NULL) { return NULL; } v->size = 0; return v; } struct vector *vector_insert(struct vector *v, size_t i, int elt) { if (v == NULL || i > v->size) return NULL; if (i == v->size) { return vector_append(v, elt); } if (v->size == v->capacity) { if (vector_resize(v, v->capacity * 2) == NULL) { return NULL; } } for (size_t j = v->size; j > i; j--) { v->data[j] = v->data[j - 1]; } v->size++; v->data[i] = elt; return v; } struct vector *vector_remove(struct vector *v, size_t i) { if (v == NULL || v->size == 0 || i >= v->size) { return NULL; } for (size_t j = i; j < v->size - 1; j++) { v->data[j] = v->data[j + 1]; } v->size--; if (v->size < v->capacity / 2) { if (vector_resize(v, v->capacity / 2) == NULL) { return NULL; } } return v; }