-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathlist.c
93 lines (70 loc) · 1.61 KB
/
list.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
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
#include <string.h>
#include "types.h"
#include "toy.h"
Toy_Type*
new_list(Toy_Type *item) {
Toy_Type *list;
list = GC_MALLOC(sizeof(Toy_Type));
ALLOC_SAFE(list);
memset((void*)list, 0, sizeof(Toy_Type));
list->tag = LIST;
list->u.list.nextp = NULL;
list->u.list.item = item;
return list;
}
Toy_Type*
new_cons(Toy_Type *car, Toy_Type *cdr) {
Toy_Type *list;
list = GC_MALLOC(sizeof(Toy_Type));
ALLOC_SAFE(list);
memset((void*)list, 0, sizeof(Toy_Type));
list->tag = LIST;
list->u.list.item = car;
list->u.list.nextp = cdr;
return list;
}
Toy_Type*
list_append(Toy_Type *list, Toy_Type *item) {
if (list == NULL) return NULL;
if (IS_LIST_NULL(list)) {
list->u.list.item = item;
return list;
}
if (NULL == list->u.list.nextp) {
list->u.list.nextp = new_list(item);
return list->u.list.nextp;
}
while (list->u.list.nextp) {
if (GET_TAG(list->u.list.nextp) != LIST) {
list->u.list.nextp = new_list(item);
return list->u.list.nextp;
}
list = list->u.list.nextp;
}
list->u.list.nextp = new_list(item);
return list->u.list.nextp;
}
/*
Toy_Type*
list_next(Toy_Type *list) {
if (list == NULL) return NULL;
return list->u.list.nextp;
}
Toy_Type*
list_get_item(Toy_Type *list) {
if (list == NULL) return 0;
return list->u.list.item;
}
*/
int
list_length(Toy_Type *list) {
int length = 1;
if (NULL == list) return 0;
if (IS_LIST_NULL(list)) return 0;
while (list->u.list.nextp) {
list = list->u.list.nextp;
length++;
if (GET_TAG(list) != LIST) return length;
}
return length;
}