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;
+}
+
* \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);
* \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 */
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: ");
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: ");
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");