summaryrefslogtreecommitdiff
path: root/rushs/evalexpr/vector/vector.c
diff options
context:
space:
mode:
authorMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:08:27 +0200
committerMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:08:27 +0200
commitc9b6b9a5ca082fe7c1b6f58d7713f785a9eb6a5c (patch)
tree3e4f42f93c7ae89a364e4d51fff6e5cec4e55fa9 /rushs/evalexpr/vector/vector.c
add: graphs et rushs
Diffstat (limited to 'rushs/evalexpr/vector/vector.c')
-rw-r--r--rushs/evalexpr/vector/vector.c152
1 files changed, 152 insertions, 0 deletions
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;
+}