/* * This is a cellular automaton library * * Copyright (C) 2016-2017 Antoine BARTUCCIO, Jean POREE DE RIDDER * * Licensed under the MIT License,(the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * hhttps://opensource.org/licenses/MIT * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * */ #include #include #include #include #include #define SUCCESS 0 #define FAILURE 1 List * createList() { List *list = malloc(sizeof(*list)); if(list != NULL){ list->head = NULL; list->tail = NULL; list->size = 0; } return list; } int unshift(List *list, cellElement *data){ int ok = SUCCESS; /* Create a new element */ ListElement *newElement = malloc(sizeof(*newElement)); if (list != NULL && newElement != NULL){ newElement->data = data; newElement->pos = -1; /* Insert the element at the begining of the list */ newElement->previous = NULL; if (list->head != NULL){ list->head->previous = newElement; } else { list->tail = newElement; } newElement->next = list->head; list->head = newElement; list->size = list->size + 1; } else { if (newElement != NULL){ free(newElement); } ok = FAILURE; } return ok; } int push(List *list, cellElement *data){ int ok = SUCCESS; ListElement *newElement = malloc(sizeof(*newElement)); if(list != NULL && newElement != NULL){ newElement->data = data; newElement->pos = -1; newElement->next = NULL; if (list->tail == NULL){ list->tail = newElement; list->head = newElement; newElement->previous = NULL; } else { newElement->previous = list->tail; list->tail->next = newElement; list->tail = newElement; } list->size = list->size + 1; } else { if (newElement != NULL){ free(newElement); } ok = FAILURE; } return ok; } ListElement * getElement(List *list, int nb){ ListElement *current = NULL; int i; if (list != NULL && (nb < list->size || -nb < list->size)){ if (nb == list->size -1 || nb == -1){ current = list->tail; } else if (nb == 0){ current = list->head; } else if (nb <= (list->size - 1)/2 && nb > 0){ i = 0; current = list->head; while(inext; i++; } } else { i = list->size - 1; if (nb < 0){ nb = list->size + nb -1; } while(i>nb){ current = current->previous; i = i - 1; } } } return current; } int popPtnList(List *list, ListElement *element){ int ok = SUCCESS; if (list != NULL && element != NULL){ if (list->head == element && list->tail == element){ list->head = NULL; list->tail = NULL; } else if (list->head == element){ list->head = element->next; element->previous = NULL; } else if (list->tail == element){ list->tail = element->previous; element->previous->next = NULL; } else { element->next->previous = element->previous; element->previous->next = element->next; } if (element->data != NULL){ freeCellElement(element->data); } free(element); list->size = list->size - 1; } else { ok = FAILURE; } return ok; } int removeElement(List *list, int nb){ int ok = SUCCESS; ListElement *toDelete = getElement(list, nb); if (toDelete != NULL){ ok = popPtnList(list, toDelete); } else { ok = FAILURE; } return ok; } int shift(List *list){ return removeElement(list, 0); } int pop(List *list){ return removeElement(list, -1); } int deleteListContent(List *list){ int ok = SUCCESS; ListElement * current = NULL; ListElement * toDelete = NULL; if (list != NULL){ current = list->head; while (current != NULL){ toDelete = current; current = current->next; free(toDelete); } list->head = NULL; list->tail = NULL; list->size = 0; } else { ok = FAILURE; } return ok; } int freeList(List *list){ int ok = SUCCESS; if (list != NULL){ ok = deleteListContent(list); if (ok == SUCCESS){ free(list); } } else { ok = FAILURE; } return ok; } ListElement * getElementPos(List *list, int pos){ ListElement * el = list->head; while (el != NULL && el->pos != pos){ el = el->next; } return el; } int removeElementPos(List *list, int pos){ int ok = SUCCESS; ListElement *toDelete = getElementPos(list, pos); if (toDelete != NULL){ ok = popPtnList(list, toDelete); } else { ok = FAILURE; } return ok; } int insertBeforeElement(List *list, ListElement *eli, ListElement *elp){ int ok = SUCCESS; if (list != NULL){ if (elp->previous == NULL){ eli->next = elp; eli->previous = NULL; elp->previous = eli; } else { eli->next = elp; eli->previous = elp->previous; elp->previous->next = eli; elp->previous = eli; } list->size = list->size + 1; } else { ok = FAILURE; } return ok; } int insertAfterElement(List *list, ListElement *eli, ListElement *elb){ int ok = SUCCESS; if (list != NULL){ if (elb->next == NULL){ eli->next = NULL; eli->previous = elb; elb->next = eli; } else { eli->previous = elb; eli->next=elb->next; elb->next->previous = eli; elb->next = eli; } list->size = list->size + 1; } else { ok = FAILURE; } return ok; } int insertBefore(List *list, cellElement *data, int nb){ int ok = SUCCESS; ListElement *newElement = NULL; ListElement *eli = getElement(list, nb); if (eli != NULL){ newElement = malloc(sizeof(*newElement)); if (newElement != NULL){ newElement->pos = -1; newElement->data = data; ok = insertBeforeElement(list, newElement, eli); } else { ok = FAILURE; } } else { ok = FAILURE; } return ok; } int insertAfter(List *list, cellElement *data, int nb){ int ok = SUCCESS; ListElement *newElement = NULL; ListElement *elb = getElement(list, nb); if (elb != NULL){ newElement = malloc(sizeof(*newElement)); if (newElement != NULL){ newElement->pos = -1; newElement->data = data; ok = insertAfterElement(list, newElement, elb); } else { ok = FAILURE; } } else { ok = FAILURE; } return ok; } int insertBeforePos(List *list, cellElement *data, int pos){ int ok = SUCCESS; ListElement *newElement = NULL; ListElement *eli = getElementPos(list, pos); if (eli != NULL){ newElement = malloc(sizeof(*newElement)); if (newElement != NULL){ newElement->pos = -1; newElement->data = data; ok = insertBeforeElement(list, newElement, eli); } else { ok = FAILURE; } } else { ok = FAILURE; } return ok; } int insertAfterPos(List *list, cellElement *data, int pos){ int ok = SUCCESS; ListElement *newElement = NULL; ListElement *elb = getElementPos(list, pos); if (elb != NULL){ newElement = malloc(sizeof(*newElement)); if (newElement != NULL){ newElement->pos = -1; newElement->data = data; ok = insertAfterElement(list, newElement, elb); } else { ok = FAILURE; } } else { ok = FAILURE; } return ok; }