diff options
| -rw-r--r-- | lichen.c | 47 | ||||
| -rw-r--r-- | lichen.h | 9 | ||||
| -rw-r--r-- | lichen.test.c | 30 | 
3 files changed, 86 insertions, 0 deletions
| @@ -49,6 +49,53 @@ li_llnode_t * li_copy_llnode(li_llnode_t *n) {  void li_free_llnode(li_llnode_t *n, void (*free_data)(void*)) {    if (n != NULL) {      free_data(n->data); +    li_free_llnode(n->next, free_data);    }    free(n);  } + + +struct li_ll_t * li_alloc_ll() { +  struct li_ll_t *list = malloc(sizeof(struct li_ll_t)); +  if (list == NULL) { +    fprintf(stderr, "failed to allocate linked list\n"); +    return NULL; +  } + +  list->tag = 0; +  list->count = 0; +  list->head = NULL; +  list->end = NULL; +  return list; +} + +void li_free_ll(struct li_ll_t *list, void (*free_data)(void*)) { +  if (list != NULL) { +    li_free_llnode(list->head, free_data); +  } +  free(list); +} + + +void li_ll_append(struct li_ll_t *list, void *data) { +  li_llnode_t *n = li_alloc_llnode(); +  n->data = data; +  if (n == NULL) { +    return; +  } +  if (list->end != NULL) { +    list->end->next = n; +    list->end = n; +  } else { +    list->head = n; +    list->end = n; +  } +  list->count += 1; +} + +struct li_ll_t * li_copy_list(struct li_ll_t *list) { +  list = list; +  return NULL; +} + + @@ -41,9 +41,18 @@ typedef struct li_ll_t {    int tag;    size_t count;    li_llnode_t *head; +  li_llnode_t *end;  } li_ll_t; +// allocate a linked list +struct li_ll_t * li_alloc_ll(); +// free a linked list +void li_free_ll(struct li_ll_t *list, void (*free_data)(void*)); +void li_ll_append(struct li_ll_t *list, void *data); +struct li_ll_t * li_copy_list(struct li_ll_t *list); + +  #endif diff --git a/lichen.test.c b/lichen.test.c index 68d26d0..bca7d27 100644 --- a/lichen.test.c +++ b/lichen.test.c @@ -51,6 +51,36 @@ LILY_TEST("allocate, copy, and destroy llnode") {  #include LILY_PUSH_TEST() + +LILY_TEST("append to list") { +  struct li_ll_t *list = li_alloc_ll(); +  REQUIRE_NEQ(list, NULL, "%p"); + +  int a = 1; int b = 2; int c = 3; + +  li_ll_append(list, &a); +  CHECK_EQ(list->count, 1, "%d"); +  REQUIRE_NEQ(list->head, NULL, "%p"); +  CHECK_EQ(list->head->data, &a, "%p"); +  CHECK_EQ(list->head->next, NULL, "%p"); + +  li_ll_append(list, &b); +  CHECK_EQ(list->count, 2, "%d"); +  REQUIRE_NEQ(list->head->next, NULL, "%p"); +  CHECK_EQ(list->head->next->data, &b, "%p"); +  CHECK_EQ(list->head->next->next, NULL, "%p"); + +  li_ll_append(list, &c); +  CHECK_EQ(list->count, 3, "%d"); +  REQUIRE_NEQ(list->head->next->next, NULL, "%p"); +  CHECK_EQ(list->head->next->next->data, &c, "%p"); +  CHECK_EQ(list->head->next->next->next, NULL, "%p"); + +  li_free_ll(list, do_nothing); +} +#include LILY_PUSH_TEST() + +  #define LILY_FILE_END  #include LILY_REGISTER_TESTS() | 
