diff options
| author | Martial Simon <msimon_fr@hotmail.com> | 2025-09-15 01:08:27 +0200 |
|---|---|---|
| committer | Martial Simon <msimon_fr@hotmail.com> | 2025-09-15 01:08:27 +0200 |
| commit | c9b6b9a5ca082fe7c1b6f58d7713f785a9eb6a5c (patch) | |
| tree | 3e4f42f93c7ae89a364e4d51fff6e5cec4e55fa9 /rushs/evalexpr/vector | |
add: graphs et rushs
Diffstat (limited to 'rushs/evalexpr/vector')
| -rw-r--r-- | rushs/evalexpr/vector/Makefile | 13 | ||||
| -rw-r--r-- | rushs/evalexpr/vector/vector.c | 152 | ||||
| -rw-r--r-- | rushs/evalexpr/vector/vector.h | 64 |
3 files changed, 229 insertions, 0 deletions
diff --git a/rushs/evalexpr/vector/Makefile b/rushs/evalexpr/vector/Makefile new file mode 100644 index 0000000..744241f --- /dev/null +++ b/rushs/evalexpr/vector/Makefile @@ -0,0 +1,13 @@ +CC = gcc +CFLAGS = -Wall -Werror -Wvla -Wextra -std=c99 -pedantic + +.PHONY: library clean + +library: vector.o + ar csr libvector.a vector.o + +vector.o: vector.c + $(CC) $(CFLAGS) -c -o vector.o vector.c + +clean: + $(RM) libvector.a vector.o diff --git a/rushs/evalexpr/vector/vector.c b/rushs/evalexpr/vector/vector.c new file mode 100644 index 0000000..cbd19aa --- /dev/null +++ b/rushs/evalexpr/vector/vector.c @@ -0,0 +1,152 @@ +#include "vector.h" + +#include <stdio.h> +#include <stdlib.h> + +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; +} diff --git a/rushs/evalexpr/vector/vector.h b/rushs/evalexpr/vector/vector.h new file mode 100644 index 0000000..5afada7 --- /dev/null +++ b/rushs/evalexpr/vector/vector.h @@ -0,0 +1,64 @@ +#ifndef VECTOR_H +#define VECTOR_H + +#include <stddef.h> + +struct vector +{ + // The number of elements in the vector + size_t size; + // The maximum number of elements in the vector + size_t capacity; + // The elements themselves + int *data; +}; + +/* +** Initialize the vector with `n` capacity. +** Returns `NULL` if an error occured. +*/ +struct vector *vector_init(size_t n); + +/* +** Release the memory used by the vector. +** Does nothing if `v` is `NULL`. +*/ +void vector_destroy(struct vector *v); + +/* +** Resize the vector to `n` capacity. +** Returns `NULL` if an error occured. +*/ +struct vector *vector_resize(struct vector *v, size_t n); + +/* +** Append an element to the end of the vector. Expand the vector if needed. +** Returns `NULL` if an error occured. +*/ +struct vector *vector_append(struct vector *v, int elt); + +/* +** Display the vector contents on `stdout`. +** Displays `\n` if `v` is `NULL`. +*/ +void vector_print(const struct vector *v); + +/* +** Remove all the elements of the vector, and resize it to `n` capacity. +** Returns `NULL` if an error occured. +*/ +struct vector *vector_reset(struct vector *v, size_t n); + +/* +** Insert `n` at the index `i`. Expand the vector if needed. +** Returns `NULL` if an error occured. +*/ +struct vector *vector_insert(struct vector *v, size_t i, int elt); + +/* +** Remove the element at the index `i`. +** Returns `NULL` if an error occured. +*/ +struct vector *vector_remove(struct vector *v, size_t i); + +#endif /* !VECTOR_H */ |
