Commit 571b09a

mo khan <mo.khan@gmail.com>
2020-06-22 22:48:53
Swap tail with non adjacent node
1 parent a29ab35
Changed files (1)
assignments/01/swap_doubly_linked_list_test.c
@@ -102,7 +102,8 @@ static void swap(Node *x, Node *y) {
     x->prev = y->prev;
     x->prev->next = x;
     x->next = yn;
-    x->next->prev = x;
+    if (yn)
+      x->next->prev = x;
     y->prev = xp;
     if (xp)
       y->prev->next = y;
@@ -393,6 +394,33 @@ Ensure(DoublyLinkedList, when_swapping_tail_adjacent_inverted) {
   free(head);
 }
 
+Ensure(DoublyLinkedList, when_swapping_tail_with_non_adjacent_node) {
+  Node *head = initialize(100);
+  Node *mid1 = add(head, 200);
+  Node *mid2 = add(head, 300);
+  Node *tail = add(head, 400);
+
+  swap(mid1, tail);
+
+  assert_that(head->prev, is_equal_to(NULL));
+  assert_that(head->data, is_equal_to(100));
+  assert_that(head->next, is_equal_to(tail));
+
+  assert_that(mid1->prev, is_equal_to(mid2));
+  assert_that(mid1->data, is_equal_to(200));
+  assert_that(mid1->next, is_equal_to(NULL));
+
+  assert_that(mid2->prev, is_equal_to(tail));
+  assert_that(mid2->data, is_equal_to(300));
+  assert_that(mid2->next, is_equal_to(mid1));
+
+  assert_that(tail->prev, is_equal_to(head));
+  assert_that(tail->data, is_equal_to(400));
+  assert_that(tail->next, is_equal_to(mid2));
+
+  free(head);
+}
+
 Ensure(DoublyLinkedList, when_swapping_with_NULL) {
   Node *head = initialize(100);
   Node *mid = add(head, 200);
@@ -447,7 +475,7 @@ TestSuite *swap_doubly_linked_list_tests() {
   add_test_with_context(suite, DoublyLinkedList, when_swapping_mid_adjacent_y);
   add_test_with_context(suite, DoublyLinkedList, when_swapping_tail_adjacent);
   add_test_with_context(suite, DoublyLinkedList, when_swapping_tail_adjacent_inverted);
-  /*add_test_with_context(suite, DoublyLinkedList, when_swapping_tail_with_non_adjacent_node);*/
+  add_test_with_context(suite, DoublyLinkedList, when_swapping_tail_with_non_adjacent_node);
   add_test_with_context(suite, DoublyLinkedList, when_swapping_with_NULL);
   add_test_with_context(suite, DoublyLinkedList, when_swapping_self);