X-Git-Url: https://git.llucax.com/z.facultad/75.42/calculadora.git/blobdiff_plain/f7547b1b03c5f2554012658ef7aeafee91c7227c..a8a23ec5e446b056284de0976cc1f3344ee8c6ad:/dllist.c?ds=sidebyside diff --git a/dllist.c b/dllist.c index 20f45c6..8b427dc 100644 --- a/dllist.c +++ b/dllist.c @@ -18,19 +18,29 @@ /* Para usar NULL, malloc() y free(). */ #include -bool DLList_init(DLList* list) { +DLList* DLList_new(void) { /* Aloco memoria para la lista. */ - /*list = (DLList*)malloc(sizeof(DLList));*/ - /* Si la obtuve, inicializo todo a NULL y devuelvo TRUE. */ + DLList* list = (DLList*)malloc(sizeof(DLList)); + /* Si la obtuve, inicializo todo a NULL. */ if (list) { list->first = NULL; list->current = NULL; list->last = NULL; - return TRUE; - /* Si no hay más memoria devuelvo FALSE. */ - } else { - return FALSE; } + /* Devuelvo el nuevo puntero. */ + return list; +} + +void DLList_delete(DLList* list) { + /* Si el puntero a la lista no es NULL. */ + if (list) { + /* Elimino los nodos. */ + while (!DLList_empty(list)) { + DLList_pop(list); + } + } + /* Libero memoria de la lista. */ + free(list); } bool DLList_empty(DLList* list) { @@ -177,3 +187,31 @@ void* DLList_pop(DLList* list) { return data; } +void* DLList_remove_current(DLList* list) { + /* Nodo actual */ + DLNode* current = list->current; + /* Datos del nodo actual. */ + void* data = current->data; + /* Si tiene siguiente. */ + if (current->next) { + /* Se pone como anterior del siguiente al anterior del actual. */ + current->next->prev = current->prev; + /* Si no tiene siguiente, se pone como último al anterior del actual. */ + } else { + list->last = current->prev; + } + /* Si tiene anterior. */ + if (current->prev) { + /* Se pone como siguiente del anterior al siguiente del actual. */ + current->prev->next = current->next; + /* Si no tiene anterior, se pone como primero al siguiente del actual. */ + } else { + list->first = current->next; + } + /* Pongo como elemento actual al próximo elemento. */ + list->current = current->next; + /* Libero memoria del nodo. */ + free(current); + return data; +} +