summaryrefslogtreecommitdiffhomepage
path: root/misc/examples/list.c
blob: ad8bebb8162de8bdde5f77b69202b1c1072bdc86 (plain)
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
#include <stdio.h>
#include <time.h>
#include <stc/algo/filter.h>
#include <stc/crand.h>

#define i_type DList
#define i_key double
#define i_cmp_native
#include <stc/clist.h>

int main(void) {
    const int n = 3000000;
    DList list = {0};

    crand_t rng = crand_init(1234567);
    int m = 0;
    c_forrange (n)
        DList_push_back(&list, crand_f64(&rng)*n + 100), ++m;

    double sum = 0.0;
    printf("sumarize %d:\n", m);
    c_foreach (i, DList, list)
        sum += *i.ref;
    printf("sum %f\n\n", sum);

    c_forfilter (i, DList, list, c_flt_take(i, 10))
        printf("%8d: %10f\n", c_flt_getcount(i), *i.ref);

    puts("sort");
    DList_sort(&list); // qsort O(n*log n)
    puts("sorted");

    c_forfilter (i, DList, list, c_flt_take(i, 10))
        printf("%8d: %10f\n", c_flt_getcount(i), *i.ref);
    puts("");

    DList_drop(&list);
    list = c_init(DList, {10, 20, 30, 40, 30, 50});

    const double* v = DList_get(&list, 30);
    printf("found: %f\n", *v);

    c_foreach (i, DList, list)
        printf(" %g", *i.ref);
    puts("");

    DList_remove(&list, 30);
    DList_insert_at(&list, DList_begin(&list), 5); // same as push_front()
    DList_push_back(&list, 500);
    DList_push_front(&list, 1964);

    printf("Full: ");
    c_foreach (i, DList, list)
        printf(" %g", *i.ref);

    printf("\nSubs: ");
    DList_iter it = DList_begin(&list);

    c_foreach (i, DList, DList_advance(it, 4), DList_end(&list))
        printf(" %g", *i.ref);
    puts("");

    DList_drop(&list);
}