diff --git a/examples/linked_list_node.c b/examples/linked_list_node.c index e267a4e..922ef61 100644 --- a/examples/linked_list_node.c +++ b/examples/linked_list_node.c @@ -23,7 +23,7 @@ int main(int argc, char const *argv[]) } size_t s = 0; - for (list_node *node = l->head; node != NULL; node = node->next, s++) + for (list_node *node = l_front_node(l); node != NULL; node = l_next_node(node), s++) { if (node->prev == NULL) printf("[ %d, ", node->data); diff --git a/src/deque.h b/src/deque.h index 7c44355..a7f100d 100644 --- a/src/deque.h +++ b/src/deque.h @@ -73,8 +73,8 @@ FMOD bool PFX##_push_back_if(SNAME *_deque_, V element, bool condition); \ FMOD bool PFX##_pop_front_if(SNAME *_deque_, bool condition); \ FMOD bool PFX##_pop_back_if(SNAME *_deque_, bool condition); \ - FMOD V PFX##_back(SNAME *_deque_); \ FMOD V PFX##_front(SNAME *_deque_); \ + FMOD V PFX##_back(SNAME *_deque_); \ FMOD bool PFX##_empty(SNAME *_deque_); \ FMOD bool PFX##_full(SNAME *_deque_); \ FMOD size_t PFX##_count(SNAME *_deque_); \ @@ -221,14 +221,6 @@ return false; \ } \ \ - FMOD V PFX##_back(SNAME *_deque_) \ - { \ - if (PFX##_empty(_deque_)) \ - return 0; \ - \ - return _deque_->buffer[(_deque_->rear == 0) ? _deque_->capacity - 1 : _deque_->rear - 1]; \ - } \ - \ FMOD V PFX##_front(SNAME *_deque_) \ { \ if (PFX##_empty(_deque_)) \ @@ -237,6 +229,14 @@ return _deque_->buffer[_deque_->front]; \ } \ \ + FMOD V PFX##_back(SNAME *_deque_) \ + { \ + if (PFX##_empty(_deque_)) \ + return 0; \ + \ + return _deque_->buffer[(_deque_->rear == 0) ? _deque_->capacity - 1 : _deque_->rear - 1]; \ + } \ + \ FMOD bool PFX##_empty(SNAME *_deque_) \ { \ return _deque_->count == 0; \ diff --git a/src/linkedlist.h b/src/linkedlist.h index 4e53def..25b3a53 100644 --- a/src/linkedlist.h +++ b/src/linkedlist.h @@ -79,19 +79,23 @@ FMOD bool PFX##_pop_back(SNAME *_list_); \ FMOD bool PFX##_push_if(SNAME *_list_, V element, size_t index, bool condition); \ FMOD bool PFX##_pop_if(SNAME *_list_, size_t index, bool condition); \ - FMOD V PFX##_back(SNAME *_list_); \ - FMOD V PFX##_get(SNAME *_list_, size_t index); \ FMOD V PFX##_front(SNAME *_list_); \ + FMOD V PFX##_get(SNAME *_list_, size_t index); \ + FMOD V PFX##_back(SNAME *_list_); \ FMOD bool PFX##_empty(SNAME *_list_); \ FMOD size_t PFX##_count(SNAME *_list_); \ \ FMOD SNAME##_node *PFX##_new_node(SNAME *_owner_, V element); \ + FMOD SNAME##_node *PFX##_front_node(SNAME *_list_); \ FMOD SNAME##_node *PFX##_get_node(SNAME *_list_, size_t index); \ + FMOD SNAME##_node *PFX##_back_node(SNAME *_list_); \ FMOD bool PFX##_insert_nxt(SNAME##_node *node, V element); \ FMOD bool PFX##_insert_prv(SNAME##_node *node, V element); \ FMOD bool PFX##_remove_nxt(SNAME##_node *node); \ FMOD bool PFX##_remove_cur(SNAME##_node *node); \ FMOD bool PFX##_remove_prv(SNAME##_node *node); \ + FMOD SNAME##_node *PFX##_next_node(SNAME##_node *node); \ + FMOD SNAME##_node *PFX##_prev_node(SNAME##_node *node); \ \ FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target); \ FMOD bool PFX##_iter_start(SNAME##_iter *iter); \ @@ -339,6 +343,61 @@ return _list_->count; \ } \ \ + FMOD SNAME##_node *PFX##_new_node(SNAME *_owner_, V element) \ + { \ + SNAME##_node *node = malloc(sizeof(SNAME##_node)); \ + \ + if (!node) \ + return NULL; \ + \ + node->owner = _owner_; \ + node->data = element; \ + node->next = NULL; \ + node->prev = NULL; \ + \ + return node; \ + } \ + \ + FMOD SNAME##_node *PFX##_front_node(SNAME *_list_) \ + { \ + return _list_->head; \ + } \ + \ + FMOD SNAME##_node *PFX##_get_node(SNAME *_list_, size_t index) \ + { \ + if (index >= _list_->count) \ + return NULL; \ + \ + if (PFX##_empty(_list_)) \ + return NULL; \ + \ + SNAME##_node *scan = NULL; \ + \ + if (index <= _list_->count / 2) \ + { \ + scan = _list_->head; \ + for (size_t i = 0; i < index; i++) \ + { \ + scan = scan->next; \ + } \ + } \ + else \ + { \ + scan = _list_->tail; \ + for (size_t i = _list_->count - 1; i > index; i--) \ + { \ + scan = scan->prev; \ + } \ + } \ + \ + return scan; \ + } \ + \ + FMOD SNAME##_node *PFX##_back_node(SNAME *_list_) \ + { \ + return _list_->tail; \ + } \ + \ FMOD bool PFX##_insert_nxt(SNAME##_node *node, V element) \ { \ SNAME##_node *new_node = PFX##_new_node(node->owner, element); \ @@ -442,49 +501,14 @@ return true; \ } \ \ - FMOD SNAME##_node *PFX##_new_node(SNAME *_owner_, V element) \ + FMOD SNAME##_node *PFX##_next_node(SNAME##_node *node) \ { \ - SNAME##_node *node = malloc(sizeof(SNAME##_node)); \ - \ - if (!node) \ - return NULL; \ - \ - node->owner = _owner_; \ - node->data = element; \ - node->next = NULL; \ - node->prev = NULL; \ - \ - return node; \ + return node->next; \ } \ \ - FMOD SNAME##_node *PFX##_get_node(SNAME *_list_, size_t index) \ + FMOD SNAME##_node *PFX##_prev_node(SNAME##_node *node) \ { \ - if (index >= _list_->count) \ - return NULL; \ - \ - if (PFX##_empty(_list_)) \ - return NULL; \ - \ - SNAME##_node *scan = NULL; \ - \ - if (index <= _list_->count / 2) \ - { \ - scan = _list_->head; \ - for (size_t i = 0; i < index; i++) \ - { \ - scan = scan->next; \ - } \ - } \ - else \ - { \ - scan = _list_->tail; \ - for (size_t i = _list_->count - 1; i > index; i--) \ - { \ - scan = scan->prev; \ - } \ - } \ - \ - return scan; \ + return node->prev; \ } \ \ FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ diff --git a/src/list.h b/src/list.h index 789f349..e8714f0 100644 --- a/src/list.h +++ b/src/list.h @@ -70,9 +70,9 @@ FMOD bool PFX##_pop_back(SNAME *_list_); \ FMOD bool PFX##_push_if(SNAME *_list_, V element, size_t index, bool condition); \ FMOD bool PFX##_pop_if(SNAME *_list_, size_t index, bool condition); \ - FMOD V PFX##_back(SNAME *_list_); \ - FMOD V PFX##_get(SNAME *_list_, size_t index); \ FMOD V PFX##_front(SNAME *_list_); \ + FMOD V PFX##_get(SNAME *_list_, size_t index); \ + FMOD V PFX##_back(SNAME *_list_); \ FMOD bool PFX##_empty(SNAME *_list_); \ FMOD bool PFX##_full(SNAME *_list_); \ FMOD size_t PFX##_count(SNAME *_list_); \