X-Git-Url: https://git.llucax.com/z.facultad/75.42/calculadora.git/blobdiff_plain/9bd9e775760d72533fcf53dde53f5f6c8f634895..8f5992a5811ef292022a3ca3ac293c231e2b065b:/dllist.c diff --git a/dllist.c b/dllist.c index 773d5e1..8b427dc 100644 --- a/dllist.c +++ b/dllist.c @@ -15,21 +15,32 @@ */ #include "dllist.h" +/* 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; + list->first = NULL; + list->current = NULL; + list->last = NULL; } + /* 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) { @@ -96,8 +107,8 @@ bool DLList_unshift(DLList* list, void* data) { list->current = node; /* Si la lista está vacía hay que hacer apuntar todo al nuevo nodo. */ if (list->first == NULL) { - list->first = node; - list->last = node; + list->first = node; + list->last = node; /* Si no está vacía. */ } else { /* Apunto el nodo anterior al primer nodo de la lista al nuevo. */ @@ -121,8 +132,8 @@ bool DLList_push(DLList* list, void* data) { list->current = node; /* Si la lista está vacía hay que hacer apuntar todo al nuevo nodo. */ if (list->first == NULL) { - list->first = node; - list->last = node; + list->first = node; + list->last = node; /* Si no está vacía. */ } else { /* Apunto el próximo nodo del último nodo de la lista al nuevo. */ @@ -176,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; +} +