From 57fa71e18022ce3e93b2456a9b6ac057ec760e64 Mon Sep 17 00:00:00 2001 From: Jeremy Raymond Date: Thu, 5 Apr 2012 21:13:27 -0400 Subject: [PATCH] Add list reverse and length functions --- src/np_linkedlist.c | 40 +++++++++++++++++++++++++++++++++++++++ src/np_linkedlist.h | 2 ++ test/np_linkedlist_test.c | 31 +++++++++++++++++++++++++++--- 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/np_linkedlist.c b/src/np_linkedlist.c index a03e00d..0c7f980 100644 --- a/src/np_linkedlist.c +++ b/src/np_linkedlist.c @@ -93,3 +93,43 @@ void *np_linkedlist_pop(struct NpLinkedList *list) free(node); return item; } + +/** + Reverses the list. + + @param list The list. + */ +void np_linkedlist_reverse(struct NpLinkedList *list) +{ + struct NpLinkedListNode *prev; + struct NpLinkedListNode *next; + + prev = NULL; + while(list->head) { + next = list->head->next; + list->head->next = prev; + prev = list->head; + list->head = next; + } + list->head = prev; +} + +/** + Determines the length of the list. + + @param list The list. + @return the length of the list. + */ +unsigned np_linkedlist_length(struct NpLinkedList *list) +{ + struct NpLinkedListNode *node; + unsigned length; + + length = 0; + node = list->head; + while (node) { + ++length; + node = node->next; + } + return length; +} diff --git a/src/np_linkedlist.h b/src/np_linkedlist.h index 82e18b5..32aa3ec 100644 --- a/src/np_linkedlist.h +++ b/src/np_linkedlist.h @@ -32,5 +32,7 @@ struct NpLinkedList *np_linkedlist_new(); void np_linkedlist_free(struct NpLinkedList *list); void *np_linkedlist_push(struct NpLinkedList *list, void *item); void *np_linkedlist_pop(struct NpLinkedList *list); +void np_linkedlist_reverse(struct NpLinkedList *list); +unsigned np_linkedlist_length(struct NpLinkedList *list); #endif diff --git a/test/np_linkedlist_test.c b/test/np_linkedlist_test.c index a740da9..c6a3649 100644 --- a/test/np_linkedlist_test.c +++ b/test/np_linkedlist_test.c @@ -27,14 +27,39 @@ void np_linkedlist_test(void) { char *data1 = "The first data item"; char *data2 = "The second data item"; + /* push and pop */ CU_ASSERT_NOT_EQUAL(NULL, list = np_linkedlist_new()); CU_ASSERT_STRING_EQUAL(data1, np_linkedlist_push(list, data1)); - CU_ASSERT_STRING_EQUAL(data1, (char *)np_linkedlist_pop(list)); + CU_ASSERT_STRING_EQUAL(data1, np_linkedlist_pop(list)); CU_ASSERT_EQUAL(NULL, np_linkedlist_pop(list)); CU_ASSERT_STRING_EQUAL(data1, np_linkedlist_push(list, data1)); CU_ASSERT_STRING_EQUAL(data2, np_linkedlist_push(list, data2)); - CU_ASSERT_STRING_EQUAL(data2, (char *)np_linkedlist_pop(list)); - CU_ASSERT_STRING_EQUAL(data1, (char *)np_linkedlist_pop(list)); + CU_ASSERT_STRING_EQUAL(data2, np_linkedlist_pop(list)); + CU_ASSERT_STRING_EQUAL(data1, np_linkedlist_pop(list)); CU_ASSERT_EQUAL(NULL, np_linkedlist_pop(list)); + + /* reverse */ + np_linkedlist_reverse(list); + CU_ASSERT_EQUAL(NULL, np_linkedlist_pop(list)); + + np_linkedlist_push(list, data1); + np_linkedlist_reverse(list); + CU_ASSERT_STRING_EQUAL(data1, np_linkedlist_pop(list)); + CU_ASSERT_EQUAL(NULL, np_linkedlist_pop(list)); + + np_linkedlist_push(list, data1); + np_linkedlist_push(list, data2); + np_linkedlist_reverse(list); + CU_ASSERT_STRING_EQUAL(data1, np_linkedlist_pop(list)); + CU_ASSERT_STRING_EQUAL(data2, np_linkedlist_pop(list)); + CU_ASSERT_EQUAL(NULL, np_linkedlist_pop(list)); + + /* length */ + CU_ASSERT_EQUAL(0, np_linkedlist_length(list)); + np_linkedlist_push(list, data1); + CU_ASSERT_EQUAL(1, np_linkedlist_length(list)); + np_linkedlist_push(list, data1); + CU_ASSERT_EQUAL(2, np_linkedlist_length(list)); + np_linkedlist_free(list); }