#include <stdio.h>
#include <malloc.h>


/********************************************
int i;
LinkedList* list = newLinkedList();
for(i = 0 ; i < 10; i ++)
	list->append(list,i);
for(i = 0 ; i < list->length; i ++)
	printf("%d\n",list->get(list, i)->data);

*********************************************/
typedef struct ListNodeType
{
	int data;
	struct ListNodeType* preNode;
	struct ListNodeType* nextNode;
}ListNode;

typedef struct LinkedListType
{
	ListNode* head;
	ListNode* tail;
	int length;
	void (*append) (struct LinkedListType* self, int data);
	ListNode* (*get) (struct LinkedListType* self, int index);
	void (*del) (struct LinkedListType* self, int index);
	void (*clear) (struct LinkedListType* self);
}LinkedList;

void removeNode(LinkedList* self, int index);
void appendListNode(LinkedList* self, int data);
ListNode* accessListNode(LinkedList* self, int index);
void clearLinkedList(LinkedList* self);
LinkedList* newLinkedList()
{
	LinkedList* list = (LinkedList*) malloc( sizeof(LinkedList) );
	list->head = NULL;
	list->tail = NULL;
	list->append = appendListNode;
	list->get = accessListNode;
	list->del = removeNode;
	list->clear = clearLinkedList;
	list->length = 0;
	return list;
}
ListNode* newListNode(int data)
{
	ListNode* node = (ListNode*) malloc( sizeof(ListNode) );
	node->nextNode = NULL;
	node->preNode = NULL;
	node->data = data;
	return node;
}
void appendListNode(LinkedList* self, int data)
{
	if(	self->head == NULL )
	{
		self->head = newListNode(data);
		self->tail = self->head;
	}
	else
	{
		self->tail->nextNode = newListNode(data);
		self->tail->nextNode->preNode = self->tail;
		self->tail = self->tail->nextNode;
	}
	self->length++;
}
ListNode* accessListNode(LinkedList* self, int index)
{
	int i;
	ListNode* node = self->head;
	for(i = 0; i < index; i ++)
	{
		node = node->nextNode;
	}
	return node;
}

void removeNode(LinkedList* self, int index)
{
	ListNode* node = self->get(self,index);

	ListNode* pre = node->preNode;
	ListNode* next = node->nextNode;
	

	pre->nextNode = next;
	next->preNode = pre;
	
	free(node);
	
	self->length--;
}
void clearLinkedList(LinkedList* self)
{
	int i;
	int len =self->length; 
	ListNode* handle = NULL;
	for(i = 0; i < len; i++)
	{
		handle = self->head;
		self->head = self->head->nextNode;
		free(handle);
	}
	self->length = 0;
}
int main(void)
{
	int i;
	LinkedList* list = newLinkedList();
	for(i = 0 ; i < 10; i ++)
		list->append(list,i);

	for(i = 0 ; i < list->length; i ++)
		printf("%d\n",list->get(list, i)->data);
}