Advertisement
sve_vash

Untitled

Jul 7th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.15 KB | None | 0 0
  1. #include "linear_sequence.h"
  2.  
  3. typedef struct node nodeT;
  4.  
  5. struct node
  6. {
  7. LSQ_BaseTypeT value;
  8. nodeT* next;
  9. nodeT* previous;
  10. };
  11.  
  12. struct container
  13. {
  14. nodeT* prefirst;
  15. nodeT* end;
  16. int count;
  17. };
  18.  
  19. typedef struct container containerT;
  20. //typedef struct container* containerT*;
  21.  
  22. struct iterator
  23. {
  24. nodeT* node;
  25. containerT* handle;
  26. };
  27.  
  28. typedef struct iterator iteratorT;
  29.  
  30. iteratorT* make_iterator(containerT* handle)
  31. {
  32. iteratorT* iterator = (iteratorT*)malloc(sizeof(iteratorT));
  33. if (iterator)
  34. {
  35. iterator->node = NULL;
  36. iterator->handle = handle;
  37. }
  38. return iterator;
  39. }
  40.  
  41. LSQ_IteratorT make_node(LSQ_BaseTypeT value)
  42. {
  43. nodeT* node = (nodeT*)malloc(sizeof(nodeT));
  44. if (node)
  45. {
  46. node->value = value;
  47. node->next = NULL;
  48. node->previous = NULL;
  49. }
  50. return (LSQ_IteratorT)node;
  51. }
  52.  
  53. LSQ_HandleT LSQ_CreateSequence(void)
  54. {
  55. containerT* handle;
  56. handle = (containerT*)malloc(sizeof(containerT));
  57. if (handle) {
  58. handle->count = 0;
  59. handle->prefirst = (nodeT *) make_node(0);
  60. handle->end = (nodeT *) make_node(0);
  61. handle->prefirst->next = handle->end;
  62. handle->end->previous = handle->prefirst;
  63. }
  64. return (LSQ_HandleT) handle;
  65. }
  66.  
  67. void LSQ_DestroySequence(LSQ_HandleT handle)
  68. {
  69. free(handle);
  70. }
  71.  
  72. LSQ_IntegerIndexT LSQ_GetSize(LSQ_HandleT handle)
  73. {
  74. containerT* container = (containerT*)handle;
  75. LSQ_IntegerIndexT result = container->count;
  76. return result;
  77. }
  78.  
  79. /* Функция, определяющая, может ли данный итератор быть разыменован */
  80. int LSQ_IsIteratorDereferencable(LSQ_IteratorT iterator)
  81. {
  82. iteratorT* it = (iteratorT*)iterator;
  83. if (it == NULL)
  84. {
  85. return 0;
  86. }
  87. if ((it->node == it->handle->prefirst) ||
  88. (it->node == it->handle->end))
  89. {
  90. return 0;
  91. }
  92. return 1;
  93. }
  94.  
  95. /* Функция, определяющая, указывает ли данный итератор на элемент, следующий за последним в контейнере */
  96. int LSQ_IsIteratorPastRear(LSQ_IteratorT iterator)
  97. {
  98. iteratorT* it = (iteratorT*)iterator;
  99. return it->node == it->handle->end;
  100. }
  101.  
  102. /* Функция, определяющая, указывает ли данный итератор на элемент, предшествующий первому в контейнере */
  103. int LSQ_IsIteratorBeforeFirst(LSQ_IteratorT iterator)
  104. {
  105. iteratorT* it = (iteratorT*)iterator;
  106. return it->node == it->handle->prefirst;
  107. }
  108.  
  109. /* Функция разыменовывающая итератор. Возвращает указатель на элемент, на который ссылается данный итератор */
  110. LSQ_BaseTypeT* LSQ_DereferenceIterator(LSQ_IteratorT iterator)
  111. {
  112. iteratorT* it = (iteratorT*)iterator;
  113.  
  114. return &(it->node->value);
  115. }
  116.  
  117. /* Следующие три функции создают итератор в памяти и возвращают его дескриптор */
  118. /* Функция, возвращающая итератор, ссылающийся на элемент с указанным индексом */
  119. LSQ_IteratorT LSQ_GetElementByIndex(LSQ_HandleT handle, LSQ_IntegerIndexT index)
  120. {
  121. iteratorT* it = make_iterator(handle);
  122. containerT* container = (containerT*)handle;
  123. it->node = container->prefirst->next;
  124.  
  125. while(it->node->next != container->end && 0 < index)
  126. {
  127. it->node = it->node->next;
  128. index--;
  129. }
  130. return (LSQ_IteratorT)it;
  131. }
  132.  
  133. /* Функция, возвращающая итератор, ссылающийся на первый элемент контейнера */
  134. LSQ_IteratorT LSQ_GetFrontElement(LSQ_HandleT handle)
  135. {
  136. iteratorT* it = make_iterator(handle);
  137. containerT* container = (containerT*)handle;
  138. it->node = container->prefirst;
  139. return it;
  140. }
  141.  
  142. /* Функция, возвращающая итератор, ссылающийся на последний элемент контейнера */
  143. LSQ_IteratorT LSQ_GetPastRearElement(LSQ_HandleT handle)
  144. {
  145. iteratorT* it = make_iterator(handle);
  146. containerT* container = (containerT*)handle;
  147. it->node = container->end;
  148. return it;
  149. }
  150.  
  151. /* Функция, уничтожающая итератор с заданным дескриптором и освобождающая принадлежащую ему память */
  152. void LSQ_DestroyIterator(LSQ_IteratorT iterator)
  153. {
  154. free(iterator);
  155. }
  156.  
  157. /* Функция, перемещающая итератор на один элемент вперед */
  158. void LSQ_AdvanceOneElement(LSQ_IteratorT iterator)
  159. {
  160. iteratorT* it = (iteratorT*)iterator;
  161. if (it->node != it->handle->end)
  162. {
  163. it->node = it->node->next;
  164. }
  165. }
  166.  
  167. /* Функция, перемещающая итератор на один элемент назад */
  168. void LSQ_RewindOneElement(LSQ_IteratorT iterator)
  169. {
  170. iteratorT* it = (iteratorT*)iterator;
  171. if (it->node->previous != it->handle->prefirst)
  172. {
  173. it->node = it->node->previous;
  174. }
  175. }
  176.  
  177. /* Функция, перемещающая итератор на заданное смещение со знаком */
  178. void LSQ_ShiftPosition(LSQ_IteratorT iterator, LSQ_IntegerIndexT shift)
  179. {
  180. iteratorT* it = (iteratorT*)iterator;
  181. if (shift >= 0)
  182. {
  183. while (shift > 0 && it->node->next != it->handle->end)
  184. {
  185. it->node = it->node->next;
  186. shift--;
  187. }
  188. }
  189. else
  190. {
  191. while (shift < 0 && it->node->previous != it->handle->prefirst)
  192. {
  193. it->node = it->node->previous;
  194. shift++;
  195. }
  196. }
  197. }
  198.  
  199. void delete_node(nodeT* node)
  200. {
  201. if (node->next != NULL)
  202. {
  203. if (node->previous != NULL)
  204. {
  205. nodeT *prev = node->previous;
  206. node->previous = node->next;
  207. node->next = prev;
  208. free(node);
  209. }
  210. }
  211.  
  212. }
  213.  
  214. /* Функция, устанавливающая итератор на элемент с указанным номером */
  215. void LSQ_SetPosition(LSQ_IteratorT iterator, LSQ_IntegerIndexT pos)
  216. {
  217. if (iterator != NULL)
  218. {
  219. iteratorT* it = (iteratorT*)iterator;
  220. it->node = it->handle->prefirst;
  221. while (it->node->next != it->handle->end && pos > 0)
  222. {
  223. pos--;
  224. it->node = it->node->next;
  225. }
  226. }
  227.  
  228. }
  229.  
  230. /* Функция, добавляющая элемент в начало контейнера */
  231. void LSQ_InsertFrontElement(LSQ_HandleT handle, LSQ_BaseTypeT element)
  232. {
  233. if (handle)
  234. {
  235. containerT* container = (containerT*)handle;
  236. nodeT* el;
  237. nodeT* tmp;
  238. el->value = element;
  239. tmp = container->prefirst->next;
  240. container->prefirst->next = el;
  241. el->next = tmp;
  242. el->previous = container->prefirst;
  243. free(tmp);
  244. }
  245. }
  246. /* Функция, добавляющая элемент в конец контейнера */
  247. void LSQ_InsertRearElement(LSQ_HandleT handle, LSQ_BaseTypeT element)
  248. {
  249. if (handle)
  250. {
  251. containerT* container = (containerT*)handle;
  252. nodeT* el;
  253. nodeT* tmp;
  254. el->value = element;
  255. tmp = container->end->previous;
  256. container->end->previous = el;
  257. el->previous = tmp;
  258. el->next = container->end;
  259. free(tmp);
  260. }
  261. }
  262. /* Функция, добавляющая элемент в контейнер на позицию, указываемую в данный момент итератором. Элемент, на который *
  263. * указывает итератор, а также все последующие, сдвигается на одну позицию в конец. */
  264. void LSQ_InsertElementBeforeGiven(LSQ_IteratorT iterator, LSQ_BaseTypeT newElement)
  265. {
  266. if (iterator)
  267. {
  268. iteratorT* it = (iteratorT*)iterator;
  269. nodeT* el;
  270. el->value = newElement;
  271. nodeT* pr = it->node->previous;
  272. it->node->previous = el;
  273. el->next = it->node;
  274. pr->next = el;
  275. el->previous = pr;
  276. free(pr);
  277. }
  278.  
  279. }
  280.  
  281. /* Функция, удаляющая первый элемент контейнера */
  282. void LSQ_DeleteFrontElement(LSQ_HandleT handle)
  283. {
  284. if (handle)
  285. {
  286. containerT* container = (containerT*)handle;
  287. nodeT* first = container->prefirst->next;
  288. delete_node(first);
  289. }
  290.  
  291. }
  292. /* Функция, удаляющая последний элемент контейнера */
  293. void LSQ_DeleteRearElement(LSQ_HandleT handle)
  294. {
  295. if (handle)
  296. {
  297. containerT* container = (containerT*)handle;
  298. nodeT* last = container->end->previous;
  299. delete_node(last);
  300. }
  301.  
  302. }
  303. /* Функция, удаляющая элемент контейнера, указываемый заданным итератором. Все последующие элементы смещаются на *
  304. * одну позицию в сторону начала. */
  305. void LSQ_DeleteGivenElement(LSQ_IteratorT iterator)
  306. {
  307. iteratorT* it = (iteratorT*)iterator;
  308. nodeT* node = it->node;
  309. it->node = it->node->next;
  310. delete_node(node);
  311. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement