#include <stdlib.h>
struct node_struct {
MYDATA data;
struct node_struct * prev;
struct node_struct * next;
};
typedef struct node_struct node;
typedef struct ll {
node * head;
node * tail;
size_t size;
} list;
node * new_node(MYDATA data, node * prev, node * next) {
node * rv = malloc(sizeof(node));
rv->data = data;
rv->prev = prev;
rv->next = next;
return rv;
}
node * new_node_empty(node * prev, node * next) {
node * rv = malloc(sizeof(node));
rv->prev = prev;
rv->next = next;
return rv;
}
list * new_list() {
list * rv = malloc(sizeof(node));
node * tail = new_node_empty(NULL, NULL);
rv->head = new_node_empty(NULL, tail);
rv->tail = tail;
rv->tail->prev = rv->head;
rv->size = 0;
return rv;
}
void delete_list(list * list) {
while(list->head != NULL) {
node * head = list->head;
list->head = list->head->next;
free(head);
}
}
node * insert_before(list * list, node * pos, MYDATA data);
node * insert_after(list * list, node * pos, MYDATA data);
node * insert_after(list * list, node * pos, MYDATA data) {
node * rv = NULL;
if(list != NULL && pos != NULL) {
if(pos != list->tail) {
rv = new_node(data, pos, pos->next);
if(rv != NULL) {
if(pos->next != NULL) {
pos->next->prev = rv;
}
pos->next = rv;
++list->size;
}
}
else {
rv = insert_before(list, pos, data);
}
}
return rv;
}
node * insert_before(list * list, node * pos, MYDATA data) {
node * rv = NULL;
if(list != NULL && pos != NULL){
if(pos != list->head){
rv = new_node(data, pos->prev, pos);
if(rv != NULL){
if(pos->prev != NULL) {
pos->prev->next = rv;
}
pos->prev = rv;
++list->size;
}
}
else {
rv = insert_after(list, pos, data);
}
}
return rv;
}
node * remove_node(list * list, node * pos) {
node * rv = NULL;
if(list != NULL && pos != NULL) {
if(pos == list->head) {
pos = pos->next;
}
if(pos == list->tail) {
pos = pos->prev;
}
if(pos != list->head) {
rv = pos;
if(rv->prev != NULL)
rv->prev->next = rv->next;
if(rv->next != NULL)
rv->next->prev = rv->prev;
free(rv);
--list->size;
}
}
return rv;
}