Guest User

Untitled

a guest
Oct 17th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.84 KB | None | 0 0
  1. #pragma once
  2.  
  3. struct ArrayListImpl;
  4. typedef int LISTTYPE;
  5. typedef struct ArrayListImpl ArrayList;
  6.  
  7. ArrayList* new_ArrayList(int iSize);
  8. void destroy(ArrayList* list);
  9.  
  10. int indexOf(ArrayList* list, LISTTYPE element);
  11. void add(ArrayList* list, LISTTYPE element);
  12. void addBefore(ArrayList* list, int index, LISTTYPE element);
  13. void clear(ArrayList* list);
  14. _Bool contains(ArrayList* list, LISTTYPE element);
  15. _Bool removeEl(ArrayList* list, LISTTYPE element);
  16. void removeFrom(ArrayList* list, int index);
  17. void set(ArrayList* list, int index, LISTTYPE element);
  18. int size(ArrayList* list);
  19. void print(ArrayList* list);
  20. void printInfo(ArrayList* list);
  21.  
  22. #include "arraylist.h"
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25.  
  26. struct ArrayListImpl
  27. {
  28. int size, buffer, origBuffer;
  29. LISTTYPE* data;
  30. };
  31.  
  32. void incBuffer(ArrayList* list)
  33. {
  34. if (list->size == list->buffer)
  35. {
  36. list->buffer = (int)(list->buffer * 1.5 + 1);
  37. list->data = (LISTTYPE*)realloc(list->data, sizeof(LISTTYPE) * list->buffer);
  38. }
  39. }
  40.  
  41. void decBuffer(ArrayList* list)
  42. {
  43. if (list->size < list->buffer / 2.5 && list->buffer > list->origBuffer)
  44. {
  45. list->buffer = max(list->origBuffer, list->buffer / 2);
  46. list->data=(LISTTYPE*)realloc(list->data, sizeof(LISTTYPE) * list->buffer);
  47. }
  48. }
  49. void resetBuffer(ArrayList* list)
  50. {
  51. list->buffer = list->origBuffer;
  52. list->data = (LISTTYPE*)realloc(list->data, sizeof(LISTTYPE) * list->buffer);
  53. }
  54.  
  55. ArrayList* new_ArrayList(int buffer)
  56. {
  57. ArrayList* out;
  58. out = (ArrayList*)malloc(sizeof out);
  59. out->size = 0;
  60. out->buffer = buffer;
  61. out->origBuffer = buffer;
  62. out->data = (LISTTYPE*)malloc(buffer * sizeof(LISTTYPE));
  63. return out;
  64. }
  65.  
  66. void destroy(ArrayList* list)
  67. {
  68. free(list->data);
  69. }
  70.  
  71. int indexOf(ArrayList* list, LISTTYPE element)
  72. {
  73. for (int i = 0; i < list->size; ++i)
  74. {
  75. if (list->data[i] == element)
  76. return i;
  77. }
  78. return -1;
  79. }
  80.  
  81. void add(ArrayList* list, LISTTYPE element)
  82. {
  83. incBuffer(list);
  84. list->data[list->size++] = element;
  85. }
  86.  
  87. void addBefore(ArrayList* list, int from, LISTTYPE element)
  88. {
  89. if (from < 0 || from > list->size)
  90. {
  91. printf("[ERROR] Trying to add before %d. element of list having size %dn", from, list->size);
  92. return;
  93. }
  94. incBuffer(list);
  95. ++list->size;
  96. for (int i = list->size; i > from; --i)
  97. {
  98. list->data[i] = list->data[i - 1];
  99. }
  100. list->data[from] = element;
  101. }
  102.  
  103. _Bool removeEl(ArrayList* list, LISTTYPE element)
  104. {
  105. int id = indexOf(list, element);
  106. if (id == -1)
  107. return 0;
  108. --list->size;
  109. for (int i = id; i < list->size; ++i)
  110. {
  111. list->data[i] = list->data[i + 1];
  112. }
  113. decBuffer(list);
  114. return 1;
  115. }
  116.  
  117. void removeFrom(ArrayList* list, int index)
  118. {
  119. if (index < 0 || index >= list->size)
  120. {
  121. printf("[ERROR] Trying to remove %d. element of list having size %dn", index, list->size);
  122. return;
  123. }
  124. --list->size;
  125. for (int i = index; i < list->size; ++i)
  126. {
  127. list->data[i] = list->data[i + 1];
  128. }
  129. decBuffer(list);
  130. }
  131.  
  132. _Bool contains(ArrayList* list, LISTTYPE element)
  133. {
  134. return indexOf(list, element) != -1;
  135. }
  136.  
  137. int size(ArrayList* list)
  138. {
  139. return list->size;
  140. }
  141.  
  142. void clear(ArrayList* list)
  143. {
  144. list->size = 0;
  145. resetBuffer(list);
  146. }
  147.  
  148. void set(ArrayList* list, int index, LISTTYPE element)
  149. {
  150. if (index < 0 || index >= list->size)
  151. {
  152. printf("[ERROR] Trying to set %d. element of list having size %dn", index, list->size);
  153. return;
  154. }
  155. list->data[index] = element;
  156. }
  157.  
  158. void print(ArrayList* list)
  159. {
  160. printf("--- ArrayList ---n");
  161. for (int i = 0; i < list->size; ++i)
  162. {
  163. printf("%d.: %dn", i, list->data[i]);
  164. }
  165. printf("n-------------------n");
  166. }
  167.  
  168. void printInfo(ArrayList* list)
  169. {
  170. printf("--- ArrayList INFO ---nSize: %dnElement size : %dnBuffer : %dn", list->size, sizeof(int), list->buffer);
  171. }
Add Comment
Please, Sign In to add comment