From 7c783c8a23f639cff6927e004770098e609eb838 Mon Sep 17 00:00:00 2001 From: LaEntropiaa Date: Fri, 13 Feb 2026 10:21:59 -0600 Subject: [PATCH] Finished testing insert, had problems with the for loop condition and managing if insert was at the head, all resolved --- src/linkedlist.c | 20 ++++---- tests/test_linkedlist.c | 102 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 8 deletions(-) diff --git a/src/linkedlist.c b/src/linkedlist.c index 8ca6901..7f8e43e 100644 --- a/src/linkedlist.c +++ b/src/linkedlist.c @@ -2,6 +2,7 @@ #include #include #include +#include typedef struct Node { void *data; @@ -159,7 +160,7 @@ LinkedListErr linkedlist_insert(LinkedList *ll, size_t index, void *val) { return LLIST_NULL; } - if (index >= ll->len) { + if (index > ll->len) { return LLIST_OUT_OF_BOUNDS; } @@ -175,22 +176,25 @@ LinkedListErr linkedlist_insert(LinkedList *ll, size_t index, void *val) { } memcpy(new_node->data, val, ll->elem_size); - - Node *current = ll->head; - for (size_t i = 0; i < ll->len; i++) { - current = current->next; - } // is head - if (current == NULL) { + if (index == 0) { + new_node->next = ll->head; ll->head = new_node; - ll->head->next = NULL; } else { // also works for the end althoug append should be used for that i guess + Node *current = ll->head; + + for (size_t i = 0; i < index; i++) { + current = current->next; + } + Node *next = current->next; current->next = new_node; new_node->next = next; } + ll->len = ll->len + 1; + return LLIST_OK; } diff --git a/tests/test_linkedlist.c b/tests/test_linkedlist.c index 088ecd6..dba7a82 100644 --- a/tests/test_linkedlist.c +++ b/tests/test_linkedlist.c @@ -91,12 +91,114 @@ static void linkedlist_test_delete_middle(void **state) { linkedlist_destroy(ll); } +static void linkedlist_test_insert_head(void **state) { + (void) state; + + LinkedList *ll; + linkedlist_create(&ll, sizeof(int)); + for (int i = 0; i < 3; i++) { + linkedlist_append(ll, &i); + } + + int val = 3; + linkedlist_insert(ll, 0, &val); + + size_t len; + linkedlist_len(ll, &len); + assert_int_equal(len, 4); + + int n; + linkedlist_get(ll, 0, &n); + assert_int_equal(n, 3); + + linkedlist_get(ll, 1, &n); + assert_int_equal(n, 0); + + linkedlist_get(ll, 2, &n); + assert_int_equal(n, 1); + + linkedlist_get(ll, 3, &n); + assert_int_equal(n, 2); + + linkedlist_destroy(ll); +} + +static void linkedlist_test_insert_end(void **state) { + (void) state; + + LinkedList *ll; + linkedlist_create(&ll, sizeof(int)); + for (int i = 0; i < 3; i++) { + linkedlist_append(ll, &i); + } + + int val = 3; + linkedlist_insert(ll, 2, &val); + + size_t len; + linkedlist_len(ll, &len); + assert_int_equal(len, 4); + + int n; + linkedlist_get(ll, 0, &n); + assert_int_equal(n, 0); + + linkedlist_get(ll, 1, &n); + assert_int_equal(n, 1); + + linkedlist_get(ll, 2, &n); + assert_int_equal(n, 2); + + linkedlist_get(ll, 3, &n); + assert_int_equal(n, 3); + + linkedlist_destroy(ll); +} + +static void linkedlist_test_insert_middle(void **state) { + (void) state; + + LinkedList *ll; + linkedlist_create(&ll, sizeof(int)); + for (int i = 0; i < 4; i++) { + linkedlist_append(ll, &i); + } + + int val = 5; + linkedlist_insert(ll, 2, &val); + + size_t len; + linkedlist_len(ll, &len); + assert_int_equal(len, 5); + + int n; + linkedlist_get(ll, 0, &n); + assert_int_equal(n, 0); + + linkedlist_get(ll, 1, &n); + assert_int_equal(n, 1); + + linkedlist_get(ll, 2, &n); + assert_int_equal(n, 2); + + linkedlist_get(ll, 3, &n); + assert_int_equal(n, 5); + + linkedlist_get(ll, 4, &n); + assert_int_equal(n, 3); + + linkedlist_destroy(ll); +} + int main(void) { const struct CMUnitTest tests[] = { cmocka_unit_test(linkedlist_test_append_3_int), cmocka_unit_test(linkedlist_test_delete_head), cmocka_unit_test(linkedlist_test_delete_end), cmocka_unit_test(linkedlist_test_delete_middle), + cmocka_unit_test(linkedlist_test_insert_head), + cmocka_unit_test(linkedlist_test_insert_middle), + cmocka_unit_test(linkedlist_test_insert_end), }; return cmocka_run_group_tests(tests, NULL, NULL);