root / proj / libs / classes / src / list.c @ 359
History | View | Annotate | Download (2.46 KB)
1 | 226 | up20180642 | #include <lcom/lcf.h> |
---|---|---|---|
2 | |||
3 | #include "list.h" |
||
4 | |||
5 | struct list_node{
|
||
6 | list_node_t *p, *n; |
||
7 | void *val;
|
||
8 | }; |
||
9 | 316 | up20180642 | |
10 | 226 | up20180642 | list_node_t* (list_node_ctor)(list_node_t *p, list_node_t *n, void *val){
|
11 | list_node_t *ret = malloc(sizeof(list_node_t));
|
||
12 | if(ret == NULL) return NULL; |
||
13 | ret->p = p; |
||
14 | ret->n = n; |
||
15 | ret->val = val; |
||
16 | return ret;
|
||
17 | } |
||
18 | 316 | up20180642 | void (list_node_dtor)(list_node_t *p){
|
19 | 226 | up20180642 | free(p); |
20 | } |
||
21 | list_node_t* (list_node_next)(const list_node_t *p){ return p->n; } |
||
22 | list_node_t* (list_node_prev)(const list_node_t *p){ return p->p; } |
||
23 | void** (list_node_val )(list_node_t *p){ return &p->val; } |
||
24 | |||
25 | struct list{
|
||
26 | list_node_t *begin_; |
||
27 | list_node_t *end_; |
||
28 | size_t sz; |
||
29 | }; |
||
30 | 316 | up20180642 | |
31 | list_t* (list_ctor) (void){
|
||
32 | 226 | up20180642 | list_t *ret = malloc(sizeof(list_t));
|
33 | if(ret == NULL) return NULL; |
||
34 | ret->sz = 0;
|
||
35 | ret->begin_ = NULL; ret->end_ = NULL; |
||
36 | ret->begin_ = list_node_ctor(NULL, NULL, NULL); |
||
37 | ret->end_ = list_node_ctor(NULL, NULL, NULL); |
||
38 | if(ret->begin_ == NULL || ret->end_ == NULL){ |
||
39 | list_dtor(ret); |
||
40 | return NULL; |
||
41 | } |
||
42 | ret->begin_->n = ret->end_ ; |
||
43 | ret->end_ ->p = ret->begin_; |
||
44 | return ret;
|
||
45 | } |
||
46 | 316 | up20180642 | int (list_dtor) (list_t *l){
|
47 | 226 | up20180642 | if(l == NULL) return 0; |
48 | if(list_size(l) > 0) return 1; |
||
49 | list_node_dtor(l->begin_); |
||
50 | list_node_dtor(l->end_); |
||
51 | free(l); |
||
52 | return 0; |
||
53 | } |
||
54 | 316 | up20180642 | list_node_t* (list_begin) (list_t *l){ return l->begin_->n; }
|
55 | list_node_t* (list_end) (list_t *l){ return l->end_; }
|
||
56 | size_t (list_size) (const list_t *l){ return l->sz; } |
||
57 | 318 | up20180642 | int (list_empty) (const list_t *l){ return (l->sz ? false : true); } |
58 | 316 | up20180642 | list_node_t* (list_insert) (list_t *l, list_node_t *position, void *val){
|
59 | 226 | up20180642 | list_node_t *node = list_node_ctor(position->p, position, val); |
60 | position->p->n = node; |
||
61 | position->p = node; |
||
62 | ++l->sz; |
||
63 | return node;
|
||
64 | } |
||
65 | 316 | up20180642 | void* (list_erase) (list_t *l, list_node_t *position){
|
66 | 226 | up20180642 | position->p->n = position->n; |
67 | position->n->p = position->p; |
||
68 | void *ret = position->val;
|
||
69 | list_node_dtor(position); |
||
70 | --l->sz; |
||
71 | return ret;
|
||
72 | } |
||
73 | 275 | up20180642 | void (list_push_back)(list_t *l, void *val){ |
74 | list_insert(l, list_end(l), val); |
||
75 | } |
||
76 | 316 | up20180642 | void** (list_front) (list_t *l){
|
77 | 275 | up20180642 | return list_node_val(list_begin(l));
|
78 | } |
||
79 | void (list_pop_front)(list_t *l){
|
||
80 | list_erase(l, list_begin(l)); |
||
81 | } |
||
82 | 316 | up20180642 | list_node_t* (list_find) (list_t *l, void *val){
|
83 | 301 | up20180642 | list_node_t *it = list_begin(l); |
84 | while(it != list_end(l) && *list_node_val(it) != val){
|
||
85 | it = list_node_next(it); |
||
86 | } |
||
87 | return it;
|
||
88 | } |