#include "common.h"

#define MAX_VALUE 1000

typedef int DATA;
typedef struct node {
    DATA data;
    struct node *next, *prev;
} NODE;
typedef struct {
    unsigned int length;
    NODE *head, *tail;
} LIST;

NODE *create_node(DATA d);
void init_list(LIST *l);
int insert(LIST *l, unsigned int index, DATA d);
int delete(LIST *l, unsigned int index, DATA *d);
int find_index(LIST *l, DATA d);
int find_value(LIST *l, unsigned int index, DATA *d);
void print_list(LIST *l);
void free_list(LIST *l);


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

void init_list(LIST *l) {
    l->length = 0;
    l->head = l->tail = NULL;
    return;
}
    
int insert(LIST *l, unsigned int index, DATA d) {
    return 1;
   
}

int delete(LIST *l, unsigned int index, DATA *d) {
    return 1;
}

int find_index(LIST *l, DATA d) {
    return 1;
}

int find_index_in_sorted(LIST *l, DATA d) {
    return 1;
}

int find_value(LIST *l, unsigned int index, DATA *d) {
    return 1;
}

void print_list(LIST *l) {
    return;
}

void free_list(LIST *l) {
    return;
}


int main(int ac, char *av[])
{
    int n, index, i;
    DATA d, d1;
    NODE *nptr;
    LIST l;

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

    init_list(&l);
    for (i = 0; i < n; i++) {
        d = rand() % MAX_VALUE;
        index = find_index_in_sorted(&l, d);
        if (-1 == insert(&l, index, d))
            fprintf(stderr, "Inserting %d at index %d failed\n", d, index);
        else
            fprintf(stderr, "Inserted %d at index %d successfully\n", d, index);
        print_list(&l);
    }

    while (l.length > 0) {
        index = rand() % l.length;
        if (-1 == find_value(&l, index, &d))
            fprintf(stderr, "Failed to find value at index %d\n", index);
        else {
            fprintf(stderr, "Found %d at index %d, deleting\n", d, index);
            if (-1 == delete(&l, index, &d1))
                fprintf(stderr, "Delete failed\n");
            else
                assert(d == d1);
            print_list(&l);
        }
    }

    free_list(&l);
    return 0;
}
