diff --git a/lab01/zad3/include/doubly_linked_list.h b/lab01/zad3/include/doubly_linked_list.h index 637798e..164bdf8 100644 --- a/lab01/zad3/include/doubly_linked_list.h +++ b/lab01/zad3/include/doubly_linked_list.h @@ -14,6 +14,7 @@ typedef struct { size_t length; size_t element_size; Node *head; + Node *tail; } DoublyLinkedList; typedef struct { diff --git a/lab01/zad3/src/doubly_linked_list.c b/lab01/zad3/src/doubly_linked_list.c index 9732c53..0f62c01 100644 --- a/lab01/zad3/src/doubly_linked_list.c +++ b/lab01/zad3/src/doubly_linked_list.c @@ -17,6 +17,7 @@ DoublyLinkedList doubly_linked_list_new(size_t element_size) { ret.length = 0; ret.element_size = element_size; ret.head = NULL; + ret.tail = NULL; return ret; } @@ -26,20 +27,18 @@ void doubly_linked_list_insert(DoublyLinkedList *l, void *value) { l->head = node_new(value, l->element_size); l->head->next = l->head; l->head->prev = l->head; + l->tail = l->head; l->length += 1; return; } - Node *tail = l->head; - while (tail->next != l->head) { - tail = tail->next; - } + l->tail->next = node_new(value, l->element_size); + l->tail->next->next = l->head; + l->tail->next->prev = l->tail; - tail->next = node_new(value, l->element_size); - tail->next->next = l->head; - tail->next->prev = tail; + l->tail = l->tail->next; - l->head->prev = tail->next; + l->head->prev = l->tail; l->length += 1; } @@ -47,21 +46,11 @@ DoublyLinkedList doubly_linked_list_merge(DoublyLinkedList l1, DoublyLinkedList if (l1.head == NULL) return l2; if (l2.head == NULL) return l1; - Node *l1_tail = l1.head; - while (l1_tail->next != l1.head) { - l1_tail = l1_tail->next; - } + l2.head->prev = l1.tail; + l1.tail->next = l2.head; - l2.head->prev = l1_tail; - l1_tail->next = l2.head; - - Node *l2_tail = l2.head; - while (l2_tail->next != l2.head) { - l2_tail = l2_tail->next; - } - - l1.head->prev = l2_tail; - l2_tail->next = l1.head; + l1.head->prev = l2.tail; + l2.tail->next = l1.head; l1.length += l2.length;