Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "linear_sequence.h"
- #define TERM_DATA 100500;
- #define CONT(handle) ((Contptr)handle)
- #define ITER(handle) ((Iterptr)handle)
- #define NODE(handle) ((Nodeptr)handle)
- typedef struct Node Node, *Nodeptr;
- //элемент контейнера
- struct Node{
- Nodeptr prev;
- Nodeptr next;
- LSQ_BaseTypeT data;
- };
- //контейнер
- typedef struct Container{
- Nodeptr head;
- Nodeptr tail;
- unsigned int size;
- }Container, *Contptr;
- //итератор
- typedef struct Iterator{
- Contptr container;
- Nodeptr element;
- }Iterator, *Iterptr;
- //функция создания элемента
- static Nodeptr CreateNode(void){
- Nodeptr temp = (Nodeptr)malloc(sizeof(Node));
- if (temp){
- temp->next = NULL;
- temp->prev = NULL;
- temp->data = 0;
- }
- return temp;
- }
- //создание итератора
- static Iterptr CreateIter(void){
- Iterptr iter = (Iterptr)malloc(sizeof(Iterator));
- if (iter){
- iter->container = NULL;
- iter->element = NULL;
- }
- return iter;
- }
- //вывод списка
- static void PrintList(Contptr handle){
- if (!handle) return;
- printf("Container content:\n");
- printf("Terminator is %i\n", handle->head->data);
- Nodeptr temp = handle->head->next;
- printf("List of data:\n");
- if(handle->head->next == handle->tail)
- printf("No data to printing");
- else
- while (temp != handle->tail){
- printf("%i ", temp->data);
- temp = temp->next;
- }
- printf("\n");
- }
- //удаление элемента
- static void DelNode(Nodeptr handle){
- free(handle);
- }
- // Функция, создающая пустой контейнер. Возвращает назначенный ему дескриптор
- LSQ_HandleT LSQ_CreateSequence(){
- Contptr temp = (Contptr)malloc(sizeof(Container));
- if (temp){
- temp->head = CreateNode();
- temp->tail = CreateNode();
- if (temp->head && temp->tail)
- temp->head->data = TERM_DATA;
- temp->tail->data = TERM_DATA;
- temp->head->next = temp->tail;
- temp->tail->prev = temp->head;
- temp->size = 0;
- }
- return temp;
- }
- // Функция, уничтожающая контейнер с заданным дескриптором. Освобождает принадлежащую ему память
- void LSQ_DestroySequence(LSQ_HandleT handle){
- if (handle){
- Nodeptr temp = CONT(handle)->head;
- while(temp->next){
- temp = temp->next;
- DelNode(temp->prev);
- }
- DelNode(temp);
- }
- free(CONT(handle));
- }
- // Функция, добавляющая элемент в начало контейнера
- void LSQ_InsertFrontElement(LSQ_HandleT handle, LSQ_BaseTypeT element){
- if (handle){
- Iterptr temp = LSQ_GetFrontElement(handle);
- LSQ_InsertElementBeforeGiven(temp, element);
- LSQ_DestroyIterator(temp);
- }
- }
- // Функция, возвращающая текущее количество элементов в контейнере
- LSQ_IntegerIndexT LSQ_GetSize(LSQ_HandleT handle){
- if(handle)
- return CONT(handle)->size;
- }
- // Функция, возвращающая итератор, ссылающийся на элемент с указанным индексом
- LSQ_IteratorT LSQ_GetElementByIndex(LSQ_HandleT handle, LSQ_IntegerIndexT index){
- if (!handle) return NULL;
- Iterptr temp = CreateIter();
- if (!temp) return NULL;
- temp->container = CONT(handle);
- temp->element = CONT(handle)->head;
- if (index < 0) return temp;
- if (index >= CONT(handle)->size)
- temp->element = CONT(handle)->tail;
- else
- while (index > -1){
- temp->element = temp->element->next;
- index--;
- }
- return temp;
- }
- // Функция, возвращающая итератор, ссылающийся на первый элемент контейнера
- LSQ_IteratorT LSQ_GetFrontElement(LSQ_HandleT handle){
- if (handle){
- Iterptr temp = LSQ_GetElementByIndex(handle, 0);
- return temp;
- }
- else return NULL;
- }
- // Функция, возвращающая итератор, ссылающийся на "после-последнего" элемент контейнера
- LSQ_IteratorT LSQ_GetPastRearElement(LSQ_HandleT handle){
- if (handle){
- Iterptr temp = LSQ_GetElementByIndex(handle, CONT(handle)->size);
- return temp;
- }
- else return NULL;
- }
- // Функция, уничтожающая итератор с заданным дескриптором и освобождающая принадлежащую ему память
- void LSQ_DestroyIterator(LSQ_IteratorT iterator){
- free(ITER(iterator));
- }
- // Функция разыменовывающая итератор. Возвращает указатель на элемент, на который ссылается данный итератор
- LSQ_BaseTypeT* LSQ_DereferenceIterator(LSQ_IteratorT iterator){
- if (iterator)
- if (LSQ_IsIteratorDereferencable(iterator) == 1)
- return &(ITER(iterator)->element->data);
- else return NULL;
- }
- // Функция, определяющая, может ли данный итератор быть разыменован
- int LSQ_IsIteratorDereferencable(LSQ_IteratorT iterator){
- if (iterator)
- return (ITER(iterator)->element != (ITER(iterator)->container->head) && (ITER(iterator)->element != (ITER(iterator)->container->tail))) ? 1 : 0;
- else return 0; //костыль
- }
- // Функция, определяющая, указывает ли данный итератор на элемент, следующий за последним в контейнере
- int LSQ_IsIteratorPastRear(LSQ_IteratorT iterator){
- if (iterator)
- return (ITER(iterator)->element == ITER(iterator)->container->tail) ? 1 : 0;
- else return 0; //костыль
- }
- // Функция, определяющая, указывает ли данный итератор на элемент, предшествующий первому в контейнере
- int LSQ_IsIteratorBeforeFirst(LSQ_IteratorT iterator){
- if (iterator)
- return (ITER(iterator)->element == ITER(iterator)->container->head) ? 1 : 0;
- else return 0; //костыль
- }
- // Функция, перемещающая итератор на один элемент вперед
- void LSQ_AdvanceOneElement(LSQ_IteratorT iterator){
- if (iterator)
- if (ITER(iterator)->element->next)
- ITER(iterator)->element = ITER(iterator)->element->next;
- }
- // Функция, перемещающая итератор на один элемент назад
- void LSQ_RewindOneElement(LSQ_IteratorT iterator){
- if (iterator)
- if (ITER(iterator)->element->prev)
- ITER(iterator)->element = ITER(iterator)->element->prev;
- }
- // Функция, перемещающая итератор на заданное смещение со знаком
- void LSQ_ShiftPosition(LSQ_IteratorT iterator, LSQ_IntegerIndexT shift){
- if (!iterator) return;
- if (shift > 0)
- while ((shift > 0) && (ITER(iterator)->element->next)){
- ITER(iterator)->element = ITER(iterator)->element->next;
- shift--;
- }
- else while ((shift < 0) && (ITER(iterator)->element->prev)){
- ITER(iterator)->element = ITER(iterator)->element->prev;
- shift++;
- }
- }
- // Функция, устанавливающая итератор на элемент с указанным номером
- void LSQ_SetPosition(LSQ_IteratorT iterator, LSQ_IntegerIndexT pos){
- if(!iterator) return;
- ITER(iterator)->element = ITER(iterator)->container->head;
- LSQ_ShiftPosition(iterator, pos+1);
- }
- // Функция, добавляющая элемент в конец контейнера
- void LSQ_InsertRearElement(LSQ_HandleT handle, LSQ_BaseTypeT element){
- if(handle){
- Iterptr temp = LSQ_GetPastRearElement(handle);
- LSQ_InsertElementBeforeGiven(temp, element);
- LSQ_DestroyIterator(temp);
- }
- }
- // Функция, добавляющая элемент в контейнер на позицию, указываемую в данный момент итератором. Элемент, на который
- // указывает итератор, а также все последующие, сдвигается на одну позицию в конец.
- void LSQ_InsertElementBeforeGiven(LSQ_IteratorT iterator, LSQ_BaseTypeT newElement){
- if (!iterator) return;
- Nodeptr temp = CreateNode();
- if (!temp) return;
- temp->data = newElement;
- temp->next = ITER(iterator)->element;
- temp->prev = ITER(iterator)->element->prev;
- temp->prev->next = temp;
- ITER(iterator)->element->prev = temp;
- ITER(iterator)->element = temp;
- ITER(iterator)->container->size++;
- }
- // Функция, удаляющая первый элемент контейнера
- void LSQ_DeleteFrontElement(LSQ_HandleT handle){
- if (handle){
- Iterptr temp = LSQ_GetFrontElement(handle);
- LSQ_DeleteGivenElement(temp);
- LSQ_DestroyIterator(temp);
- }
- }
- // Функция, удаляющая последний элемент контейнера
- void LSQ_DeleteRearElement(LSQ_HandleT handle){
- if (handle){
- Iterptr temp = LSQ_GetPastRearElement(handle);
- temp->element = temp->element->prev;
- LSQ_DeleteGivenElement(temp);
- LSQ_DestroyIterator(temp);
- }
- }
- // Функция, удаляющая элемент контейнера, указываемый заданным итератором. Все последующие элементы смещаются на
- // одну позицию в сторону начала.
- void LSQ_DeleteGivenElement(LSQ_IteratorT iterator){
- if (!iterator) return;
- if ((ITER(iterator)->element == ITER(iterator)->container->head) || (ITER(iterator)->element == ITER(iterator)->container->tail)) return;
- Nodeptr temp = ITER(iterator)->element;
- ITER(iterator)->element = ITER(iterator)->element->next;
- temp->prev->next = temp->next;
- temp->next->prev = temp->prev;
- DelNode(temp);
- ITER(iterator)->container->size--;
- }
Add Comment
Please, Sign In to add comment