Guest User

Untitled

a guest
Sep 25th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.67 KB | None | 0 0
  1. #include "linear_sequence.h"
  2.  
  3. #define TERM_DATA 100500;
  4. #define CONT(handle) ((Contptr)handle)
  5. #define ITER(handle) ((Iterptr)handle)
  6. #define NODE(handle) ((Nodeptr)handle)
  7.  
  8. typedef struct Node Node, *Nodeptr;
  9.  
  10. //элемент контейнера
  11. struct Node{
  12.  
  13. Nodeptr prev;
  14. Nodeptr next;
  15. LSQ_BaseTypeT data;
  16.  
  17. };
  18.  
  19.  
  20. //контейнер
  21. typedef struct Container{
  22.  
  23. Nodeptr head;
  24. Nodeptr tail;
  25. unsigned int size;
  26.  
  27. }Container, *Contptr;
  28.  
  29.  
  30. //итератор
  31. typedef struct Iterator{
  32.  
  33. Contptr container;
  34. Nodeptr element;
  35.  
  36. }Iterator, *Iterptr;
  37.  
  38.  
  39. //функция создания элемента
  40. static Nodeptr CreateNode(void){
  41.  
  42. Nodeptr temp = (Nodeptr)malloc(sizeof(Node));
  43.  
  44. if (temp){
  45. temp->next = NULL;
  46. temp->prev = NULL;
  47. temp->data = 0;
  48. }
  49. return temp;
  50.  
  51. }
  52.  
  53.  
  54. //создание итератора
  55. static Iterptr CreateIter(void){
  56.  
  57. Iterptr iter = (Iterptr)malloc(sizeof(Iterator));
  58.  
  59. if (iter){
  60. iter->container = NULL;
  61. iter->element = NULL;
  62. }
  63. return iter;
  64.  
  65. }
  66.  
  67.  
  68. //вывод списка
  69. static void PrintList(Contptr handle){
  70.  
  71. if (!handle) return;
  72.  
  73. printf("Container content:\n");
  74.  
  75. printf("Terminator is %i\n", handle->head->data);
  76.  
  77. Nodeptr temp = handle->head->next;
  78.  
  79. printf("List of data:\n");
  80. if(handle->head->next == handle->tail)
  81. printf("No data to printing");
  82. else
  83. while (temp != handle->tail){
  84. printf("%i ", temp->data);
  85. temp = temp->next;
  86. }
  87.  
  88. printf("\n");
  89.  
  90. }
  91.  
  92. //удаление элемента
  93. static void DelNode(Nodeptr handle){
  94.  
  95. free(handle);
  96.  
  97. }
  98.  
  99.  
  100. // Функция, создающая пустой контейнер. Возвращает назначенный ему дескриптор
  101. LSQ_HandleT LSQ_CreateSequence(){
  102.  
  103. Contptr temp = (Contptr)malloc(sizeof(Container));
  104.  
  105. if (temp){
  106. temp->head = CreateNode();
  107. temp->tail = CreateNode();
  108. if (temp->head && temp->tail)
  109. temp->head->data = TERM_DATA;
  110. temp->tail->data = TERM_DATA;
  111. temp->head->next = temp->tail;
  112. temp->tail->prev = temp->head;
  113. temp->size = 0;
  114. }
  115.  
  116. return temp;
  117.  
  118. }
  119.  
  120.  
  121. // Функция, уничтожающая контейнер с заданным дескриптором. Освобождает принадлежащую ему память
  122. void LSQ_DestroySequence(LSQ_HandleT handle){
  123.  
  124. if (handle){
  125. Nodeptr temp = CONT(handle)->head;
  126. while(temp->next){
  127. temp = temp->next;
  128. DelNode(temp->prev);
  129. }
  130. DelNode(temp);
  131. }
  132.  
  133. free(CONT(handle));
  134.  
  135. }
  136.  
  137.  
  138. // Функция, добавляющая элемент в начало контейнера
  139. void LSQ_InsertFrontElement(LSQ_HandleT handle, LSQ_BaseTypeT element){
  140.  
  141. if (handle){
  142. Iterptr temp = LSQ_GetFrontElement(handle);
  143. LSQ_InsertElementBeforeGiven(temp, element);
  144. LSQ_DestroyIterator(temp);
  145. }
  146. }
  147.  
  148.  
  149. // Функция, возвращающая текущее количество элементов в контейнере
  150. LSQ_IntegerIndexT LSQ_GetSize(LSQ_HandleT handle){
  151.  
  152. if(handle)
  153. return CONT(handle)->size;
  154.  
  155. }
  156.  
  157.  
  158. // Функция, возвращающая итератор, ссылающийся на элемент с указанным индексом
  159. LSQ_IteratorT LSQ_GetElementByIndex(LSQ_HandleT handle, LSQ_IntegerIndexT index){
  160.  
  161. if (!handle) return NULL;
  162.  
  163. Iterptr temp = CreateIter();
  164.  
  165. if (!temp) return NULL;
  166.  
  167. temp->container = CONT(handle);
  168. temp->element = CONT(handle)->head;
  169.  
  170. if (index < 0) return temp;
  171. if (index >= CONT(handle)->size)
  172. temp->element = CONT(handle)->tail;
  173. else
  174. while (index > -1){
  175. temp->element = temp->element->next;
  176. index--;
  177. }
  178.  
  179. return temp;
  180.  
  181. }
  182.  
  183.  
  184. // Функция, возвращающая итератор, ссылающийся на первый элемент контейнера
  185. LSQ_IteratorT LSQ_GetFrontElement(LSQ_HandleT handle){
  186.  
  187. if (handle){
  188. Iterptr temp = LSQ_GetElementByIndex(handle, 0);
  189. return temp;
  190. }
  191.  
  192. else return NULL;
  193.  
  194. }
  195.  
  196.  
  197. // Функция, возвращающая итератор, ссылающийся на "после-последнего" элемент контейнера
  198. LSQ_IteratorT LSQ_GetPastRearElement(LSQ_HandleT handle){
  199.  
  200. if (handle){
  201. Iterptr temp = LSQ_GetElementByIndex(handle, CONT(handle)->size);
  202. return temp;
  203. }
  204.  
  205. else return NULL;
  206.  
  207. }
  208.  
  209. // Функция, уничтожающая итератор с заданным дескриптором и освобождающая принадлежащую ему память
  210. void LSQ_DestroyIterator(LSQ_IteratorT iterator){
  211.  
  212. free(ITER(iterator));
  213.  
  214. }
  215.  
  216.  
  217. // Функция разыменовывающая итератор. Возвращает указатель на элемент, на который ссылается данный итератор
  218. LSQ_BaseTypeT* LSQ_DereferenceIterator(LSQ_IteratorT iterator){
  219.  
  220. if (iterator)
  221. if (LSQ_IsIteratorDereferencable(iterator) == 1)
  222. return &(ITER(iterator)->element->data);
  223. else return NULL;
  224.  
  225. }
  226.  
  227.  
  228. // Функция, определяющая, может ли данный итератор быть разыменован
  229. int LSQ_IsIteratorDereferencable(LSQ_IteratorT iterator){
  230.  
  231. if (iterator)
  232. return (ITER(iterator)->element != (ITER(iterator)->container->head) && (ITER(iterator)->element != (ITER(iterator)->container->tail))) ? 1 : 0;
  233. else return 0; //костыль
  234.  
  235. }
  236.  
  237. // Функция, определяющая, указывает ли данный итератор на элемент, следующий за последним в контейнере
  238. int LSQ_IsIteratorPastRear(LSQ_IteratorT iterator){
  239.  
  240. if (iterator)
  241. return (ITER(iterator)->element == ITER(iterator)->container->tail) ? 1 : 0;
  242. else return 0; //костыль
  243.  
  244. }
  245.  
  246.  
  247. // Функция, определяющая, указывает ли данный итератор на элемент, предшествующий первому в контейнере
  248. int LSQ_IsIteratorBeforeFirst(LSQ_IteratorT iterator){
  249.  
  250. if (iterator)
  251. return (ITER(iterator)->element == ITER(iterator)->container->head) ? 1 : 0;
  252. else return 0; //костыль
  253.  
  254. }
  255.  
  256.  
  257. // Функция, перемещающая итератор на один элемент вперед
  258. void LSQ_AdvanceOneElement(LSQ_IteratorT iterator){
  259.  
  260. if (iterator)
  261. if (ITER(iterator)->element->next)
  262. ITER(iterator)->element = ITER(iterator)->element->next;
  263.  
  264. }
  265.  
  266. // Функция, перемещающая итератор на один элемент назад
  267. void LSQ_RewindOneElement(LSQ_IteratorT iterator){
  268.  
  269. if (iterator)
  270. if (ITER(iterator)->element->prev)
  271. ITER(iterator)->element = ITER(iterator)->element->prev;
  272.  
  273. }
  274.  
  275.  
  276. // Функция, перемещающая итератор на заданное смещение со знаком
  277. void LSQ_ShiftPosition(LSQ_IteratorT iterator, LSQ_IntegerIndexT shift){
  278.  
  279. if (!iterator) return;
  280.  
  281. if (shift > 0)
  282. while ((shift > 0) && (ITER(iterator)->element->next)){
  283. ITER(iterator)->element = ITER(iterator)->element->next;
  284. shift--;
  285. }
  286. else while ((shift < 0) && (ITER(iterator)->element->prev)){
  287. ITER(iterator)->element = ITER(iterator)->element->prev;
  288. shift++;
  289. }
  290. }
  291.  
  292.  
  293. // Функция, устанавливающая итератор на элемент с указанным номером
  294. void LSQ_SetPosition(LSQ_IteratorT iterator, LSQ_IntegerIndexT pos){
  295.  
  296. if(!iterator) return;
  297.  
  298. ITER(iterator)->element = ITER(iterator)->container->head;
  299.  
  300. LSQ_ShiftPosition(iterator, pos+1);
  301.  
  302. }
  303.  
  304.  
  305. // Функция, добавляющая элемент в конец контейнера
  306. void LSQ_InsertRearElement(LSQ_HandleT handle, LSQ_BaseTypeT element){
  307.  
  308. if(handle){
  309. Iterptr temp = LSQ_GetPastRearElement(handle);
  310. LSQ_InsertElementBeforeGiven(temp, element);
  311. LSQ_DestroyIterator(temp);
  312. }
  313. }
  314.  
  315.  
  316. // Функция, добавляющая элемент в контейнер на позицию, указываемую в данный момент итератором. Элемент, на который
  317. // указывает итератор, а также все последующие, сдвигается на одну позицию в конец.
  318. void LSQ_InsertElementBeforeGiven(LSQ_IteratorT iterator, LSQ_BaseTypeT newElement){
  319.  
  320. if (!iterator) return;
  321.  
  322. Nodeptr temp = CreateNode();
  323.  
  324. if (!temp) return;
  325.  
  326. temp->data = newElement;
  327. temp->next = ITER(iterator)->element;
  328. temp->prev = ITER(iterator)->element->prev;
  329. temp->prev->next = temp;
  330. ITER(iterator)->element->prev = temp;
  331. ITER(iterator)->element = temp;
  332. ITER(iterator)->container->size++;
  333.  
  334. }
  335.  
  336.  
  337. // Функция, удаляющая первый элемент контейнера
  338. void LSQ_DeleteFrontElement(LSQ_HandleT handle){
  339.  
  340. if (handle){
  341. Iterptr temp = LSQ_GetFrontElement(handle);
  342. LSQ_DeleteGivenElement(temp);
  343. LSQ_DestroyIterator(temp);
  344. }
  345. }
  346.  
  347.  
  348. // Функция, удаляющая последний элемент контейнера
  349. void LSQ_DeleteRearElement(LSQ_HandleT handle){
  350.  
  351. if (handle){
  352. Iterptr temp = LSQ_GetPastRearElement(handle);
  353. temp->element = temp->element->prev;
  354. LSQ_DeleteGivenElement(temp);
  355. LSQ_DestroyIterator(temp);
  356. }
  357. }
  358.  
  359.  
  360. // Функция, удаляющая элемент контейнера, указываемый заданным итератором. Все последующие элементы смещаются на
  361. // одну позицию в сторону начала.
  362. void LSQ_DeleteGivenElement(LSQ_IteratorT iterator){
  363.  
  364. if (!iterator) return;
  365.  
  366. if ((ITER(iterator)->element == ITER(iterator)->container->head) || (ITER(iterator)->element == ITER(iterator)->container->tail)) return;
  367.  
  368. Nodeptr temp = ITER(iterator)->element;
  369. ITER(iterator)->element = ITER(iterator)->element->next;
  370.  
  371. temp->prev->next = temp->next;
  372. temp->next->prev = temp->prev;
  373.  
  374. DelNode(temp);
  375.  
  376. ITER(iterator)->container->size--;
  377.  
  378. }
Add Comment
Please, Sign In to add comment