diff options
| author | mo khan <mo.khan@gmail.com> | 2020-06-22 15:57:54 -0600 |
|---|---|---|
| committer | mo khan <mo.khan@gmail.com> | 2020-06-22 15:57:54 -0600 |
| commit | 39933f4bc10e875acfb5ae6bf419399120f365bb (patch) | |
| tree | 34ade1d55996f8cdefc70ca7e2b1d48bb5d38b4b | |
| parent | 8762219df2e6c9a46bcbb84878a46e72a4ba1b49 (diff) | |
Swap adjacent nodes
| -rw-r--r-- | assignments/01/swap_doubly_linked_list_test.c | 84 |
1 files changed, 76 insertions, 8 deletions
diff --git a/assignments/01/swap_doubly_linked_list_test.c b/assignments/01/swap_doubly_linked_list_test.c index fe295e7..0461072 100644 --- a/assignments/01/swap_doubly_linked_list_test.c +++ b/assignments/01/swap_doubly_linked_list_test.c @@ -82,14 +82,26 @@ static void swap(Node *x, Node *y) { Node *xp = x->prev, *xn = x->next, *yp = y->prev, *yn = y->next; - x->prev = y->prev; - x->prev->next = x; - x->next = yn; - x->next->prev = x; - y->prev = xp; - y->prev->next = y; - y->next = xn; - y->next->prev = y; + // if adjacent + if (x->next == y && y->prev == x) { + x->next = y->next; + x->next->prev = x; + x->prev = y; + y->next = x; + y->prev = xp; + y->prev->next = y; + } else if (x->prev == y && y->next == x) { + swap(y, x); + } else { + x->prev = y->prev; + x->prev->next = x; + x->next = yn; + x->next->prev = x; + y->prev = xp; + y->prev->next = y; + y->next = xn; + y->next->prev = y; + } } Ensure(DoublyLinkedList, when_getting_head) { @@ -247,6 +259,60 @@ Ensure(DoublyLinkedList, when_swapping_y_mid) { free(head); } +Ensure(DoublyLinkedList, when_swapping_mid_adjacent) { + Node *head = initialize(100); + Node *mid1 = add(head, 200); + Node *mid2 = add(head, 300); + Node *tail = add(head, 400); + + swap(mid1, mid2); + + assert_that(head->prev, is_equal_to(NULL)); + assert_that(head->data, is_equal_to(100)); + assert_that(head->next, is_equal_to(mid2)); + + assert_that(mid1->prev, is_equal_to(mid2)); + assert_that(mid1->data, is_equal_to(200)); + assert_that(mid1->next, is_equal_to(tail)); + + assert_that(mid2->prev, is_equal_to(head)); + assert_that(mid2->data, is_equal_to(300)); + assert_that(mid2->next, is_equal_to(mid1)); + + assert_that(tail->prev, is_equal_to(mid1)); + assert_that(tail->data, is_equal_to(400)); + assert_that(tail->next, is_equal_to(NULL)); + + free(head); +} + +Ensure(DoublyLinkedList, when_swapping_mid_adjacent_y) { + Node *head = initialize(100); + Node *mid1 = add(head, 200); + Node *mid2 = add(head, 300); + Node *tail = add(head, 400); + + swap(mid2, mid1); + + assert_that(head->prev, is_equal_to(NULL)); + assert_that(head->data, is_equal_to(100)); + assert_that(head->next, is_equal_to(mid2)); + + assert_that(mid1->prev, is_equal_to(mid2)); + assert_that(mid1->data, is_equal_to(200)); + assert_that(mid1->next, is_equal_to(tail)); + + assert_that(mid2->prev, is_equal_to(head)); + assert_that(mid2->data, is_equal_to(300)); + assert_that(mid2->next, is_equal_to(mid1)); + + assert_that(tail->prev, is_equal_to(mid1)); + assert_that(tail->data, is_equal_to(400)); + assert_that(tail->next, is_equal_to(NULL)); + + free(head); +} + Ensure(DoublyLinkedList, when_swapping_tail) { Node *head = initialize(100); Node *mid = add(head, 200); @@ -305,6 +371,8 @@ TestSuite *swap_doubly_linked_list_tests() { /*add_test_with_context(suite, DoublyLinkedList, when_swapping_y_head);*/ add_test_with_context(suite, DoublyLinkedList, when_swapping_mid); add_test_with_context(suite, DoublyLinkedList, when_swapping_y_mid); + add_test_with_context(suite, DoublyLinkedList, when_swapping_mid_adjacent); + add_test_with_context(suite, DoublyLinkedList, when_swapping_mid_adjacent_y); /*add_test_with_context(suite, DoublyLinkedList, when_swapping_tail);*/ /*add_test_with_context(suite, DoublyLinkedList, when_swapping_index_out_of_range);*/ /*add_test_with_context(suite, DoublyLinkedList, when_swapping_self);*/ |
