-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathList.c
More file actions
73 lines (60 loc) · 1004 Bytes
/
List.c
File metadata and controls
73 lines (60 loc) · 1004 Bytes
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
#include "List.h"
List createList(void (*free_item)(void*), void (*assign_parent)(void*, Node)){
List l = malloc(sizeof(struct listRep));
l->head = NULL;
l->tail = NULL;
l->free_item = free_item;
l->assign_parent = assign_parent;
return l;
}
void freeList(List l){
Node c = l->head;
Node p;
while(c){
p = c;
c = c->next;
deleteFromList(l, p);
}
free(l);
}
Node createNode(void* item){
Node n = malloc(sizeof(struct node));
n->item = item;
n->next = NULL;
n->prev = NULL;
return n;
}
void addToList(List l, void* item){
Node n = createNode(item);
l->assign_parent(item, n);
if(!l){
return;
}
if(l->tail){
l->tail->next = n;
n->prev = l->tail;
}
if(!l->head){
l->head = n;
}
l->tail = n;
}
void deleteFromList(List l, Node n){
if(!l || !n){
return;
}
if(n->prev){
n->prev->next = n->next;
}
else{
l->head = l->head->next;
}
if(n->next){
n->next->prev = n->prev;
}
else{
l->tail = l->tail->prev;
}
l->free_item(n->item);
free(n);
}