-
Notifications
You must be signed in to change notification settings - Fork 0
/
dllist_custom_free.c
62 lines (48 loc) · 1.92 KB
/
dllist_custom_free.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include "../src/text.h"
#include "../src/lists/double/dllist.h"
struct my_struct {
char *nestedString;
};
// This function will be called for every element in the list.
// The `*data` parameter represents the value we gave in the `dllist_append` call.
void freeMyStruct(void *data) {
printf("> Freeing `struct my_struct` and its data @%p\n", data);
// Freeing the nested string.
free(((struct my_struct *) data)->nestedString);
// Freeing the structure itself.
free(data);
}
int main() {
// Creating a list.
DoubleLinkedList *myList = dllist_create();
// Adding some data.
struct my_struct *myData;
myData = malloc(sizeof(struct my_struct));
myData->nestedString = text_copyA("Hello world !");
dllist_append(myList, myData, NULL);
myData = malloc(sizeof(struct my_struct));
myData->nestedString = text_copyA("Lorem ipsum donor si amet.");
dllist_append(myList, myData, NULL);
myData = malloc(sizeof(struct my_struct));
myData->nestedString = text_copyA("Test 123");
dllist_append(myList, myData, NULL);
myData = malloc(sizeof(struct my_struct));
myData->nestedString = text_copyA("I'm at the end :)");
dllist_append(myList, myData, NULL);
// Iterating over the list with direct access
printf("Iteration with direct data access:\n");
void *loopData = dllist_selectFirstData(myList);
while(loopData != NULL) {
printf("> %s\n", ((struct my_struct *) loopData)->nestedString);
// Preparing the iteration's data
loopData = dllist_selectNextData(myList);
}
printf("\n");
// Freeing the list and the strings from memory.
// This function will call the given custom `void (*cb_freeData)(void *data)` callback with each string we added.
// The second callback can be left as NULL since we use the standard list nodes,
// the standard `free` function will automatically be called for each node in this case.
printf("Freeing the list...\n");
dllist_free(myList, &freeMyStruct, NULL);
}