/* A singly linked list of integers: a struct, malloc/free, and pointer walking. */
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int value;
    struct Node *next;
} Node;

static Node *push(Node *head, int value) {
    Node *node = malloc(sizeof(Node));
    if (node == NULL) {
        perror("malloc");
        exit(EXIT_FAILURE);
    }
    node->value = value;
    node->next = head;
    return node;
}

static long sum(const Node *head) {
    long total = 0;
    for (const Node *n = head; n != NULL; n = n->next) {
        total += n->value;
    }
    return total;
}

static void free_list(Node *head) {
    while (head != NULL) {
        Node *next = head->next;
        free(head);
        head = next;
    }
}

int main(void) {
    Node *list = NULL;
    for (int i = 1; i <= 5; i++) {
        list = push(list, i * i);
    }
    printf("sum of squares = %ld\n", sum(list));
    free_list(list);
    return 0;
}
