1#include <stdlib.h>
2#include <string.h>
3
4typedef struct Node {
5 void *data;
6 struct Node *next;
7} Node;
8
9typedef struct {
10 Node *head;
11 size_t length;
12 size_t elem_size;
13 void (*free_fn)(void *);
14} LinkedList;
15
16LinkedList *list_create(size_t elem_size, void (*free_fn)(void *)) {
17 LinkedList *list = malloc(sizeof(LinkedList));
18 if (!list) return NULL;
19 list->head = NULL;
20 list->length = 0;
21 list->elem_size = elem_size;
22 list->free_fn = free_fn;
23 return list;
24}
25
26int list_push(LinkedList *list, const void *data) {
27 Node *node = malloc(sizeof(Node));
28 if (!node) return -1;
29 node->data = malloc(list->elem_size);
30 if (!node->data) {
31 free(node);
32 return -1;
33 }
34 memcpy(node->data, data, list->elem_size);
35 node->next = list->head;
36 list->head = node;
37 list->length++;
38 return 0;
39}
40
41void list_destroy(LinkedList *list) {
42 Node *current = list->head;
43 while (current != NULL) {
44 Node *temp = current;
45 current = current->next;
46 if (list->free_fn) {
47 list->free_fn(temp->data);
48 } else {
49 free(temp->data);
50 }
51 free(temp);
52 }
53 free(list);
54}