fork download
  1. #include <stdio.h>
  2. #include <malloc.h>
  3.  
  4.  
  5. /********************************************
  6. int i;
  7. LinkedList* list = newLinkedList();
  8. for(i = 0 ; i < 10; i ++)
  9. list->append(list,i);
  10. for(i = 0 ; i < list->length; i ++)
  11. printf("%d\n",list->get(list, i)->data);
  12.  
  13. *********************************************/
  14. typedef struct ListNodeType
  15. {
  16. int data;
  17. struct ListNodeType* preNode;
  18. struct ListNodeType* nextNode;
  19. }ListNode;
  20.  
  21. typedef struct LinkedListType
  22. {
  23. ListNode* head;
  24. ListNode* tail;
  25. int length;
  26. void (*append) (struct LinkedListType* self, int data);
  27. ListNode* (*get) (struct LinkedListType* self, int index);
  28. void (*del) (struct LinkedListType* self, int index);
  29. void (*clear) (struct LinkedListType* self);
  30. }LinkedList;
  31.  
  32. void removeNode(LinkedList* self, int index);
  33. void appendListNode(LinkedList* self, int data);
  34. ListNode* accessListNode(LinkedList* self, int index);
  35. void clearLinkedList(LinkedList* self);
  36. LinkedList* newLinkedList()
  37. {
  38. LinkedList* list = (LinkedList*) malloc( sizeof(LinkedList) );
  39. list->head = NULL;
  40. list->tail = NULL;
  41. list->append = appendListNode;
  42. list->get = accessListNode;
  43. list->del = removeNode;
  44. list->clear = clearLinkedList;
  45. list->length = 0;
  46. return list;
  47. }
  48. ListNode* newListNode(int data)
  49. {
  50. ListNode* node = (ListNode*) malloc( sizeof(ListNode) );
  51. node->nextNode = NULL;
  52. node->preNode = NULL;
  53. node->data = data;
  54. return node;
  55. }
  56. void appendListNode(LinkedList* self, int data)
  57. {
  58. if( self->head == NULL )
  59. {
  60. self->head = newListNode(data);
  61. self->tail = self->head;
  62. }
  63. else
  64. {
  65. self->tail->nextNode = newListNode(data);
  66. self->tail->nextNode->preNode = self->tail;
  67. self->tail = self->tail->nextNode;
  68. }
  69. self->length++;
  70. }
  71. ListNode* accessListNode(LinkedList* self, int index)
  72. {
  73. int i;
  74. ListNode* node = self->head;
  75. for(i = 0; i < index; i ++)
  76. {
  77. node = node->nextNode;
  78. }
  79. return node;
  80. }
  81.  
  82. void removeNode(LinkedList* self, int index)
  83. {
  84. ListNode* node = self->get(self,index);
  85.  
  86. ListNode* pre = node->preNode;
  87. ListNode* next = node->nextNode;
  88.  
  89.  
  90. pre->nextNode = next;
  91. next->preNode = pre;
  92.  
  93. free(node);
  94.  
  95. self->length--;
  96. }
  97. void clearLinkedList(LinkedList* self)
  98. {
  99. int i;
  100. int len =self->length;
  101. ListNode* handle = NULL;
  102. for(i = 0; i < len; i++)
  103. {
  104. handle = self->head;
  105. self->head = self->head->nextNode;
  106. free(handle);
  107. }
  108. self->length = 0;
  109. }
  110. int main(void)
  111. {
  112. int i;
  113. LinkedList* list = newLinkedList();
  114. for(i = 0 ; i < 10; i ++)
  115. list->append(list,i);
  116.  
  117. for(i = 0 ; i < list->length; i ++)
  118. printf("%d\n",list->get(list, i)->data);
  119. }
Success #stdin #stdout 0s 2424KB
stdin
Standard input is empty
stdout
0
1
2
3
4
5
6
7
8
9