]> git.llucax.com Git - z.facultad/75.42/calculadora.git/commitdiff
Se agrega la función DLList_remove_current y su testeo.
authorLeandro Lucarella <llucax@gmail.com>
Sun, 7 Sep 2003 22:38:38 +0000 (22:38 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Sun, 7 Sep 2003 22:38:38 +0000 (22:38 +0000)
dllist.c
dllist.h
dllist_test.c

index 5a190a4419fe95e13a124e2e2287c275ccb4b73e..a7765f3f8c4bd76f2477efd9d8974608a5645b5d 100644 (file)
--- a/dllist.c
+++ b/dllist.c
@@ -187,3 +187,31 @@ void* DLList_pop(DLList* list) {
     return data;
 }
 
     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;
+}
+
index 80aff11ded80a55ac2f64c6891354c138f118e18..ad88060df3402a93e3d6ea386b678b7aa001e8cf 100644 (file)
--- 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
  * \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);
  * \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
  * \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);
 
  * \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 */
 #endif /* DLLIST_H */
index 7eca5ab6fc026d08a3b34d8e503147e853bcba9f..5897c178d7af877916cc38302f0b03795ccc0c96 100644 (file)
@@ -160,10 +160,13 @@ int main(void) {
     printf("Elemento 7: ");
     assert(DLList_next(lista) == &f);
     printf("OK!\n");
     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("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_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_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: ");
     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: ");
     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: ");
     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: ");
     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: ");
     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_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");
     assert(DLList_current(lista) == NULL);
     printf("OK!\n");
+
     printf("Chequeo si está vacía: ");
     assert(DLList_empty(lista));
     printf("OK!\n");
     printf("Chequeo si está vacía: ");
     assert(DLList_empty(lista));
     printf("OK!\n");