Project

General

Profile

Statistics
| Revision:

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

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
}