From 886038a0acce8ceb9a797927d48f8ed830ab2c08 Mon Sep 17 00:00:00 2001 From: Divlo Date: Sat, 7 Jan 2023 19:27:16 +0100 Subject: [PATCH] feat: add `array_list` data structure fixes #2 --- lib/array_list.c | 39 +++++++++++++++++++++++++++++++++++++++ lib/array_list.h | 25 +++++++++++++++++++++++++ libcproject.h | 1 + test/array_list_test.c | 42 ++++++++++++++++++++++++++++++++++++++++++ test/array_list_test.h | 6 ++++++ test/main.c | 2 ++ 6 files changed, 115 insertions(+) create mode 100644 lib/array_list.c create mode 100644 lib/array_list.h create mode 100644 test/array_list_test.c create mode 100644 test/array_list_test.h diff --git a/lib/array_list.c b/lib/array_list.c new file mode 100644 index 0000000..194060e --- /dev/null +++ b/lib/array_list.c @@ -0,0 +1,39 @@ +#include "array_list.h" + +struct array_list* array_list_initialization() { + struct array_list* list = malloc(sizeof(struct array_list)); + list->data = malloc(sizeof(void*) * ARRAY_LIST_INITIAL_CAPACITY); + list->size = 0; + list->capacity = ARRAY_LIST_INITIAL_CAPACITY; + return list; +} + +void array_list_add(struct array_list* list, void* element) { + if (list->size >= list->capacity) { + size_t previous_capacity = list->capacity; + list->capacity += ARRAY_LIST_INITIAL_CAPACITY; + list->data = realloc(list->data, sizeof(void*) * list->capacity); + for (size_t index = previous_capacity; index < list->capacity; index++) { + list->data[index] = NULL; + } + } + list->data[list->size] = element; + list->size++; +} + +void array_list_remove(struct array_list* list, size_t index) { + if (index >= list->size) { + return; + } + for (size_t i = index + 1; i < list->size - 1; i++) { + list->data[i - 1] = list->data[i]; + } + list->size--; +} + +void* array_list_get(struct array_list* list, size_t index) { + if (index >= list->size) { + return NULL; + } + return list->data[index]; +} diff --git a/lib/array_list.h b/lib/array_list.h new file mode 100644 index 0000000..ba64196 --- /dev/null +++ b/lib/array_list.h @@ -0,0 +1,25 @@ +#ifndef __ARRAY_LIST__ +#define __ARRAY_LIST__ + +#include +#include + +#include "linked_list.h" + +#define ARRAY_LIST_INITIAL_CAPACITY 10 + +struct array_list { + void** data; + size_t size; + size_t capacity; +}; + +struct array_list* array_list_initialization(); + +void array_list_add(struct array_list* list, void* element); + +void array_list_remove(struct array_list* list, size_t index); + +void* array_list_get(struct array_list* list, size_t index); + +#endif diff --git a/libcproject.h b/libcproject.h index c0d3f16..3a81352 100644 --- a/libcproject.h +++ b/libcproject.h @@ -1,6 +1,7 @@ #ifndef __LIBCPROJECT__ #define __LIBCPROJECT__ +#include "lib/array_list.h" #include "lib/character.h" #include "lib/convert.h" #include "lib/dictionary.h" diff --git a/test/array_list_test.c b/test/array_list_test.c new file mode 100644 index 0000000..021df5d --- /dev/null +++ b/test/array_list_test.c @@ -0,0 +1,42 @@ +#include "array_list_test.h" + +#include +#include +#include +#include + +#include "libcproject.h" + +void array_list_test() { + struct array_list *list = array_list_initialization(); + assert(list->size == 0); + array_list_add(list, (void *)'a'); + array_list_add(list, (void *)'b'); + array_list_add(list, (void *)'c'); + array_list_add(list, (void *)'d'); + array_list_add(list, (void *)'e'); + array_list_add(list, (void *)'f'); + assert(list->size == 6); + assert(array_list_get(list, 0) == (void *)'a'); + assert(array_list_get(list, 1) == (void *)'b'); + assert(array_list_get(list, 2) == (void *)'c'); + assert(array_list_get(list, 3) == (void *)'d'); + assert(array_list_get(list, 4) == (void *)'e'); + assert(array_list_get(list, 5) == (void *)'f'); + array_list_add(list, (void *)'a'); + assert(array_list_get(list, 6) == (void *)'a'); + assert(list->size == 7); + array_list_remove(list, 6); + assert(list->size == 6); + assert(array_list_get(list, 6) == NULL); + + for (size_t index = 0; index < 100; index++) { + array_list_add(list, (void *)index); + } + assert(list->size == 106); + assert(array_list_get(list, 100) == (void *)94); + assert(array_list_get(list, 101) == (void *)95); + array_list_remove(list, 100); + assert(list->size == 105); + assert(array_list_get(list, 100) == (void *)95); +} diff --git a/test/array_list_test.h b/test/array_list_test.h new file mode 100644 index 0000000..dc58f8c --- /dev/null +++ b/test/array_list_test.h @@ -0,0 +1,6 @@ +#ifndef __ARRAY_LIST_TEST__ +#define __ARRAY_LIST_TEST__ + +void array_list_test(); + +#endif diff --git a/test/main.c b/test/main.c index 453da0e..2ed91a2 100644 --- a/test/main.c +++ b/test/main.c @@ -1,6 +1,7 @@ #include #include +#include "array_list_test.h" #include "character_test.h" #include "convert_test.h" #include "dictionary_test.h" @@ -11,6 +12,7 @@ #include "string_test.h" int main() { + array_list_test(); character_test(); convert_test(); dictionary_test();