diff options
| author | sanine <sanine.not@pm.me> | 2025-10-24 13:32:54 -0500 | 
|---|---|---|
| committer | sanine <sanine.not@pm.me> | 2025-10-24 13:32:54 -0500 | 
| commit | 24fbfb8c41c62b11506668a22074379115f57600 (patch) | |
| tree | 1994109fe42df1e0589a9e96051a235b611ba487 /lichen.c | |
| parent | 30efa292790dfdc9eedefa97a9f82e1cac2aeaa0 (diff) | |
implement basic linked list append
Diffstat (limited to 'lichen.c')
| -rw-r--r-- | lichen.c | 47 | 
1 files changed, 47 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; +} + + | 
