#include #include #include struct Node { struct Node *next; struct Node *prev; void *dta; }; typedef struct Node Node; typedef struct { Node *head; unsigned length; } List; List *newList() { List *list = malloc(sizeof(List)); return list; } Node *_newNode(Node *next, Node *prev, void *dta) { Node *newnode = malloc(sizeof(Node)); newnode->next = next; newnode->prev = prev; newnode->dta = dta; return newnode; } Node *_traverseToLast(Node *node) { if (node->next != NULL) { return _traverseToLast(node->next); } else { return node; } } Node *_traverseToPos(Node *node, int pos) { if (pos > 0) { if (node->next != NULL) { return _traverseToPos(node->next, pos - 1); } else { return NULL; } } else { return node; } } void append(List *list, void *elem) { if (list->head == NULL) { // create head list->head = _newNode(NULL, NULL, elem); } else { // append element Node *last = _traverseToLast(list->head); last->next = _newNode(NULL, last, elem); } } int _length(Node *node) { if (node->next == NULL) { return 1; } else { return 1 + _length(node->next); } } int length(List *list) { if (list->head == NULL) { return 0; } return _length(list->head); } void insert(List *list, int position) { } void delete(List *list, int position) { Node *todel = _traverseToPos(list->head, position); if (todel->prev == NULL) { // we are the header list->head = todel->next; if (list->head != NULL) { list->head->prev = NULL; } } else if (todel->next == NULL) { // we are the last item todel->prev->next = NULL; } else { todel->prev->next = todel->next; todel->next->prev = todel->prev; } free(todel); } void deleteAll(List *list) { while (list->head != NULL) { delete(list, 0); } } void deleteList(List *list) { deleteAll(list); free(list); } List *merge(List *list1, List *list2) { return NULL; } void *first(List *list) { return list->head->dta; } void *last(List *list) { return _traverseToLast(list->head)->dta; } void print(List *list, char *typeFormatter) { Node *curr = list->head; while (curr != NULL) { printf(typeFormatter, curr->dta); printf("\n"); curr = curr->next; } } int main() { printf("Hello, World!\n"); List *mylist = newList(); append(mylist, "test"); append(mylist, "test2"); append(mylist, "test3"); print(mylist, "%s"); printf("length is: %d\n", length(mylist)); printf("\n"); deleteAll(mylist); printf("length is: %d\n", length(mylist)); print(mylist, "%s"); deleteList(mylist); return 0; }