#include "common.h"

typedef struct node {
    int data;
    struct node *next;
} NODE;


NODE *create_node(int d) {
    NODE *nptr;
    if (NULL == (nptr = Malloc(1, NODE)))
        ERR_MESG("out of memory");
    nptr->data = d;
    nptr->next = NULL;
    return nptr;
}

void insert(NODE *n1, NODE **n2) {
    /* insert n1 in front of n2 */
    if (n1 != NULL) {
        n1->next = *n2;
        *n2 = n1;
    }
}

void delete(NODE **n1) {
    /* delete the node pointed to by *n1 */
    NODE *tmp;
    if (n1 != NULL && *n1 != NULL) {
        tmp = *n1;
        *n1 = tmp->next;
        free(tmp);
    }
}

int main(int ac, char *av[])
{
    int n, i;
    NODE *head = NULL, *nptr;

    if (ac < 2)
        ERR_MESG("Usage: linked-list <number>");
    n = atoi(av[1]);

    for (i = 0; i < n; i++) {
        nptr = create_node(i);
        insert(nptr, &head);
    }

    for (i = 0, nptr = head; nptr != NULL; i++, nptr = nptr->next)
        if (i % 3 == 0)
            delete(&nptr->next);
 
    for (nptr = head; nptr != NULL; nptr = nptr->next)
        printf("%d ", nptr->data);
    putchar('\n');

    return 0;
}
