Code for the Exercise

 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
@ <stdio.hdr>
@ <stdlib.hdr>

struct Node
{
    val: int;
    next: -> Node;
};

fn prependToList(list: -> -> Node, val: int)
{
    local n: -> Node = malloc(sizeof(*n));
    if (!n) {
        printf("out of memory\n");
        exit(1);
    }
    n->val = val;
    n->next = *list;
    *list = n;
}

fn printList(list: -> Node)
{
    for (; list; list = list->next) {
        printf("val = %d\n", list->val);
    }
}

fn printListRec(list: -> Node)
{
    if (list) {
        printf("val = %d\n", list->val);
        printListRec(list->next);
    }
}

fn printListReverse(list: -> Node)
{
    if (list) {
        printListReverse(list->next);
        printf("val = %d\n", list->val);
    }
}

fn freeList(list: -> Node)
{
    if (list) {
        freeList(list->next);
        free(list);
    }
}

fn main()
{
    local list: -> Node = nullptr;

    for (local i: int = 1; i <= 10; ++i) {
        prependToList(&list, i);
    }

    //printf("5 is %s list\n", isInList(list, 5) ? "in" : "not in");

    printf("list:\n");
    printList(list);

    printf("list:\n");
    printListRec(list);

    printf("list in reverse order:\n");
    printListReverse(list);

    freeList(list);
}