From 06e5c9c5f5a210456e38654b46299b5f780432c9 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Sun, 7 Sep 2003 22:38:38 +0000 Subject: [PATCH] =?utf8?q?Se=20agrega=20la=20funci=C3=B3n=20DLList=5Fremov?= =?utf8?q?e=5Fcurrent=20y=20su=20testeo.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- dllist.c | 28 ++++++++++++++++++++++++++++ dllist.h | 19 +++++++++++++++++-- dllist_test.c | 27 ++++++++++++--------------- 3 files changed, 57 insertions(+), 17 deletions(-) diff --git a/dllist.c b/dllist.c index 5a190a4..a7765f3 100644 --- a/dllist.c +++ b/dllist.c @@ -187,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; +} + diff --git a/dllist.h b/dllist.h index 80aff11..ad88060 100644 --- a/dllist.h +++ b/dllist.h @@ -215,7 +215,7 @@ bool DLList_push(DLList* list, void* data); * \return Primer elemento de la DLList. * \see DLList_empty(), DLList_pop() * \pre La DLList debe estar \ref DLList_new "creada" correctamente y no - * debe estar \ref DLList_empty "vacía. + * debe estar \ref DLList_empty "vacía". * \post El puntero interno de la DLList apunta primer elemento. */ void* DLList_shift(DLList* list); @@ -239,9 +239,24 @@ void* DLList_shift(DLList* list); * \return Último elemento de la DLList. * \see DLList_empty(), DLList_shift() * \pre La DLList debe estar \ref DLList_new "creada" correctamente y no - * debe estar \ref DLList_empty "vacía. + * debe estar \ref DLList_empty "vacía". * \post El puntero interno de la DLList apunta último elemento. */ void* DLList_pop(DLList* list); +/** + * Elimina el elemento actual de la DLList. + * Elimina el elemento actual de la DLList devolviendo su contenido. + * + * \param list DLList de la cual sacar el elemento. + * + * \return Elemento actual de la DLList o NULL si no hay más elementos. + * \see DLList_empty(), DLList_current(), DLList_have_more() + * \pre La DLList debe estar \ref DLList_new "creada" correctamente y + * debe \ref DLList_have_more "tener un elemento actual" (por lo que + * también debe estar no \ref DLList_empty "vacía"). + * \post El puntero interno de la DLList apunta al próximo elemento. + */ +void* DLList_remove_current(DLList* list); + #endif /* DLLIST_H */ diff --git a/dllist_test.c b/dllist_test.c index 7eca5ab..5897c17 100644 --- a/dllist_test.c +++ b/dllist_test.c @@ -160,10 +160,13 @@ int main(void) { printf("Elemento 7: "); assert(DLList_next(lista) == &f); printf("OK!\n"); - printf("Elemento 8: "); - assert(DLList_next(lista) == &g); + printf("Elimino elemento 7: "); + assert(DLList_remove_current(lista) == &f); + printf("OK!\n"); + printf("Me dejó en el elmento 8 (ahora 7): "); + assert(DLList_current(lista) == &g); printf("OK!\n"); - printf("Elemento 9: "); + printf("Elemento 8: "); assert(DLList_next(lista) == NULL); printf("OK!\n"); printf("Chequeo que no haya más elementos: "); @@ -181,21 +184,21 @@ int main(void) { assert(DLList_pop(lista) == &g); printf("OK!\n"); printf("Chequeo elemento actual: "); - assert(DLList_current(lista) == &f); + assert(DLList_current(lista) == &e); printf("OK!\n"); printf("Saco el último elemento: "); - assert(DLList_pop(lista) == &f); + assert(DLList_pop(lista) == &e); printf("OK!\n"); printf("Chequeo elemento actual: "); - assert(DLList_current(lista) == &e); + assert(DLList_current(lista) == &b); printf("OK!\n"); printf("Saco el último elemento: "); - assert(DLList_pop(lista) == &e); + assert(DLList_pop(lista) == &b); printf("OK!\n"); printf("Chequeo elemento actual: "); - assert(DLList_current(lista) == &b); + assert(DLList_current(lista) == &a); printf("OK!\n"); printf("Saco el primer elemento: "); @@ -216,15 +219,9 @@ int main(void) { assert(DLList_shift(lista) == &a); printf("OK!\n"); printf("Chequeo elemento actual: "); - assert(DLList_current(lista) == &b); - printf("OK!\n"); - - printf("Saco el primer elemento: "); - assert(DLList_shift(lista) == &b); - printf("OK!\n"); - printf("Chequeo elemento actual: "); assert(DLList_current(lista) == NULL); printf("OK!\n"); + printf("Chequeo si está vacía: "); assert(DLList_empty(lista)); printf("OK!\n"); -- 2.43.0