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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
#include "ll.h"
#include <stddef.h>
void dlinkedlist_init(dlinkedlist **ll) {
(*ll) = xcalloc(1, sizeof(**ll));
(*ll)->start = NULL;
(*ll)->end = NULL;
(*ll)->size = 0;
return;
}
void dlinkedlist_free(dlinkedlist **ll) {
dllnode *p = (*ll)->start, *n;
while(p != NULL) {
n = p->next;
if(p->dfreecb != NULL)
p->dfreecb(p->data);
free(p);
p = n;
}
free(*ll);
(*ll) = NULL;
return;
}
int dlinkedlist_firstitem(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)) {
if(!ll)
return -1;
if(ll->size != 0)
return 0;
dllnode *n = xcalloc(1, sizeof(*n));
n->next = NULL;
n->prev = NULL;
n->data = data;
n->dfreecb = dfreecb;
ll->start = n;
ll->end = n;
ll->size = 1;
return 1;
}
int dlinkedlist_insert(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)) {
if(!ll)
return -1;
if(dlinkedlist_firstitem(ll, data, dfreecb) > 0)
return 0;
dllnode *n = xcalloc(1, sizeof(*n));
n->data = data;
n->dfreecb = dfreecb;
n->prev = NULL;
n->next = ll->start;
ll->start->prev = n;
ll->start = n;
ll->size++;
return 0;
}
int dlinkedlist_append(dlinkedlist * const ll, void *data, int (*dfreecb)(void*)) {
if(!ll)
return -1;
if(dlinkedlist_firstitem(ll, data, dfreecb) > 0)
return 0;
dllnode *n = xcalloc(1, sizeof(*n));
n->data = data;
n->dfreecb = dfreecb;
n->prev = ll->end;
n->next = NULL;
ll->end->next = n;
ll->end = n;
ll->size++;
return 0;
}
dllnode *dlinkedlist_get(const dlinkedlist * const ll, size_t index) {
if(index >= ll->size)
return NULL;
dllnode *p = ll->start;
for(size_t i = 0; i < index && p != NULL; i++, p = p->next);
return p;
}
|