#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;
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;
}
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
); }