Project

General

Profile

Statistics
| Revision:

root / proj / libs / classes / src / list.c @ 307

History | View | Annotate | Download (2.4 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
list_node_t* (list_node_ctor)(list_node_t *p, list_node_t *n, void *val){
10
    list_node_t *ret = malloc(sizeof(list_node_t));
11
    if(ret == NULL) return NULL;
12
    ret->p = p;
13
    ret->n = n;
14
    ret->val = val;
15
    return ret;
16
}
17
void (list_node_dtor)(list_node_t *p){
18
    free(p);
19
}
20
list_node_t* (list_node_next)(const list_node_t *p){ return p->n; }
21
list_node_t* (list_node_prev)(const list_node_t *p){ return p->p; }
22
void**       (list_node_val )(list_node_t *p){ return &p->val; }
23
24
struct list{
25
    list_node_t *begin_;
26
    list_node_t *end_;
27
    size_t sz;
28
};
29
list_t* (list_ctor)(void){
30
    list_t *ret = malloc(sizeof(list_t));
31
    if(ret == NULL) return NULL;
32
    ret->sz = 0;
33
    ret->begin_ = NULL; ret->end_ = NULL;
34
    ret->begin_ = list_node_ctor(NULL, NULL, NULL);
35
    ret->end_   = list_node_ctor(NULL, NULL, NULL);
36
    if(ret->begin_ == NULL || ret->end_ == NULL){
37
        list_dtor(ret);
38
        return NULL;
39
    }
40
    ret->begin_->n = ret->end_  ;
41
    ret->end_  ->p = ret->begin_;
42
    return ret;
43
}
44
int (list_dtor)(list_t *l){
45
    if(l == NULL) return 0;
46
    if(list_size(l) > 0) return 1;
47
    list_node_dtor(l->begin_);
48
    list_node_dtor(l->end_);
49
    free(l);
50
    return 0;
51
}
52
list_node_t* (list_begin )(      list_t *l){ return l->begin_->n; }
53
list_node_t* (list_end   )(      list_t *l){ return l->end_; }
54
size_t       (list_size  )(const list_t *l){ return l->sz; }
55 275 up20180642
int          (list_empty )(const list_t *l){ return !(l->sz); }
56 226 up20180642
list_node_t* (list_insert)(list_t *l, list_node_t *position, void *val){
57
    list_node_t *node = list_node_ctor(position->p, position, val);
58
    position->p->n = node;
59
    position->p    = node;
60
    ++l->sz;
61
    return node;
62
}
63
void*        (list_erase )(list_t *l, list_node_t *position){
64
    position->p->n = position->n;
65
    position->n->p = position->p;
66
    void *ret = position->val;
67
    list_node_dtor(position);
68
    --l->sz;
69
    return ret;
70
}
71 275 up20180642
void         (list_push_back)(list_t *l, void *val){
72
    list_insert(l, list_end(l), val);
73
}
74
void**       (list_front)(list_t *l){
75
    return list_node_val(list_begin(l));
76
}
77
void         (list_pop_front)(list_t *l){
78
    list_erase(l, list_begin(l));
79
}
80 301 up20180642
list_node_t* (list_find)(list_t *l, void *val){
81
    list_node_t *it = list_begin(l);
82
    while(it != list_end(l) && *list_node_val(it) != val){
83
        it = list_node_next(it);
84
    }
85
    return it;
86
}