Changed linkedlist IO relative to a node

This commit is contained in:
Leonardo committed 2019-05-07 17:20:01 -03:00
1 parent 2f767f7623
commit 21ab3eeb07
2 files changed
+98 -80

No files matched your search

+22 -6
View File
@@ -7,13 +7,14 @@
* Leonardo Vencovsky (https://github.com/LeoVen) * Leonardo Vencovsky (https://github.com/LeoVen)
* *
*/ */
#include "linkedlist.h"
#include <stdio.h> #include <stdio.h>
#include <assert.h> #include <assert.h>
#include "linkedlist.h" #include <inttypes.h>
LINKEDLIST_GENERATE(l, list, /* static */, int) LINKEDLIST_GENERATE(l, list, /* static */, int)
int main(int argc, char const *argv[]) int main(void)
{ {
list *l = l_new(); list *l = l_new();
@@ -25,14 +26,14 @@ int main(int argc, char const *argv[])
{ {
if (node->data % 3 == 0) if (node->data % 3 == 0)
{ {
l_insert_prv(node, 33); l_insert_before(l, node, 33);
l_insert_nxt(node, 99); l_insert_after(l, node, 99);
node = node->next; // skip 99 node = node->next; // skip 99
} }
} }
size_t s = 0; size_t s = 0;
for (list_node *node = l_front_node(l); node != NULL; node = l_next_node(node), s++) for (list_node *node = l_head(l); node != NULL; node = l_next_node(node), s++)
{ {
if (node->prev == NULL) if (node->prev == NULL)
printf("[ %d, ", node->data); printf("[ %d, ", node->data);
@@ -42,7 +43,22 @@ int main(int argc, char const *argv[])
printf("%d, ", node->data); printf("%d, ", node->data);
} }
printf("List Head: %d\nList Tail: %d\nList Count: %d\n", l->head->data, l->tail->data, l->count); printf("\n\n");
s = 0;
for (list_node *node = l_tail(l); node != NULL; node = l_prev_node(node), s++)
{
if (node->next == NULL)
printf("[ %d, ", node->data);
else if (node->prev == NULL)
printf("%d ]\n", node->data);
else
printf("%d, ", node->data);
}
printf("\n\n");
printf("List Head: %d\nList Tail: %d\nList Count: %" PRIuMAX "\n", l->head->data, l->tail->data, l->count);
assert(s == l->count); assert(s == l->count);
+76 -74
View File
@@ -48,7 +48,6 @@
struct SNAME##_node_s \ struct SNAME##_node_s \
{ \ { \
V data; \ V data; \
struct SNAME##_s *owner; \
struct SNAME##_node_s *next; \ struct SNAME##_node_s *next; \
struct SNAME##_node_s *prev; \ struct SNAME##_node_s *prev; \
}; \ }; \
@@ -88,17 +87,17 @@
FMOD bool PFX##_empty(SNAME *_list_); \ FMOD bool PFX##_empty(SNAME *_list_); \
FMOD size_t PFX##_count(SNAME *_list_); \ FMOD size_t PFX##_count(SNAME *_list_); \
\ \
FMOD SNAME##_node *PFX##_new_node(SNAME *_owner_, V element); \ FMOD SNAME##_node *PFX##_new_node(V element); \
FMOD SNAME##_node *PFX##_front_node(SNAME *_list_); \ FMOD SNAME##_node *PFX##_head(SNAME *_list_); \
FMOD SNAME##_node *PFX##_get_node(SNAME *_list_, size_t index); \ FMOD SNAME##_node *PFX##_get_node(SNAME *_list_, size_t index); \
FMOD SNAME##_node *PFX##_back_node(SNAME *_list_); \ FMOD SNAME##_node *PFX##_tail(SNAME *_list_); \
FMOD bool PFX##_insert_nxt(SNAME##_node *node, V element); \ FMOD bool PFX##_insert_after(SNAME *_owner_, SNAME##_node *_node_, V element); \
FMOD bool PFX##_insert_prv(SNAME##_node *node, V element); \ FMOD bool PFX##_insert_before(SNAME *_owner_, SNAME##_node *_node_, V element); \
FMOD bool PFX##_remove_nxt(SNAME##_node *node); \ FMOD bool PFX##_remove_after(SNAME *_owner_, SNAME##_node *_node_); \
FMOD bool PFX##_remove_cur(SNAME##_node *node); \ FMOD bool PFX##_remove_current(SNAME *_owner_, SNAME##_node *_node_); \
FMOD bool PFX##_remove_prv(SNAME##_node *node); \ FMOD bool PFX##_remove_before(SNAME *_owner_, SNAME##_node *_node_); \
FMOD SNAME##_node *PFX##_next_node(SNAME##_node *node); \ FMOD SNAME##_node *PFX##_next_node(SNAME##_node *_node_); \
FMOD SNAME##_node *PFX##_prev_node(SNAME##_node *node); \ FMOD SNAME##_node *PFX##_prev_node(SNAME##_node *_node_); \
\ \
FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target); \ FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target); \
FMOD bool PFX##_iter_start(SNAME##_iter *iter); \ FMOD bool PFX##_iter_start(SNAME##_iter *iter); \
@@ -150,7 +149,7 @@
\ \
FMOD bool PFX##_push_front(SNAME *_list_, V element) \ FMOD bool PFX##_push_front(SNAME *_list_, V element) \
{ \ { \
SNAME##_node *node = PFX##_new_node(_list_, element); \ SNAME##_node *node = PFX##_new_node(element); \
\ \
if (!node) \ if (!node) \
return false; \ return false; \
@@ -186,7 +185,7 @@
return PFX##_push_back(_list_, element); \ return PFX##_push_back(_list_, element); \
} \ } \
\ \
SNAME##_node *node = PFX##_new_node(_list_, element); \ SNAME##_node *node = PFX##_new_node(element); \
\ \
if (!node) \ if (!node) \
return false; \ return false; \
@@ -205,7 +204,7 @@
\ \
FMOD bool PFX##_push_back(SNAME *_list_, V element) \ FMOD bool PFX##_push_back(SNAME *_list_, V element) \
{ \ { \
SNAME##_node *node = PFX##_new_node(_list_, element); \ SNAME##_node *node = PFX##_new_node(element); \
\ \
if (!node) \ if (!node) \
return false; \ return false; \
@@ -388,14 +387,13 @@
return _list_->count; \ return _list_->count; \
} \ } \
\ \
FMOD SNAME##_node *PFX##_new_node(SNAME *_owner_, V element) \ FMOD SNAME##_node *PFX##_new_node(V element) \
{ \ { \
SNAME##_node *node = malloc(sizeof(SNAME##_node)); \ SNAME##_node *node = malloc(sizeof(SNAME##_node)); \
\ \
if (!node) \ if (!node) \
return NULL; \ return NULL; \
\ \
node->owner = _owner_; \
node->data = element; \ node->data = element; \
node->next = NULL; \ node->next = NULL; \
node->prev = NULL; \ node->prev = NULL; \
@@ -403,7 +401,7 @@
return node; \ return node; \
} \ } \
\ \
FMOD SNAME##_node *PFX##_front_node(SNAME *_list_) \ FMOD SNAME##_node *PFX##_head(SNAME *_list_) \
{ \ { \
return _list_->head; \ return _list_->head; \
} \ } \
@@ -438,122 +436,126 @@
return scan; \ return scan; \
} \ } \
\ \
FMOD SNAME##_node *PFX##_back_node(SNAME *_list_) \ FMOD SNAME##_node *PFX##_tail(SNAME *_list_) \
{ \ { \
return _list_->tail; \ return _list_->tail; \
} \ } \
\ \
FMOD bool PFX##_insert_nxt(SNAME##_node *node, V element) \ FMOD bool PFX##_insert_after(SNAME *_owner_, SNAME##_node *_node_, V element) \
{ \ { \
SNAME##_node *new_node = PFX##_new_node(node->owner, element); \ SNAME##_node *new_node = PFX##_new_node(element); \
\ \
if (!new_node) \ if (!new_node) \
return false; \ return false; \
\ \
new_node->next = node->next; \ new_node->next = _node_->next; \
if (node->next != NULL) \ \
node->next->prev = new_node; \ if (_node_->next != NULL) \
_node_->next->prev = new_node; \
else \ else \
node->owner->tail = new_node; \ _owner_->tail = new_node; \
\ \
new_node->prev = node; \ new_node->prev = _node_; \
node->next = new_node; \ _node_->next = new_node; \
\ \
node->owner->count++; \ _owner_->count++; \
\ \
return true; \ return true; \
} \ } \
\ \
FMOD bool PFX##_insert_prv(SNAME##_node *node, V element) \ FMOD bool PFX##_insert_before(SNAME *_owner_, SNAME##_node *_node_, V element) \
{ \ { \
SNAME##_node *new_node = PFX##_new_node(node->owner, element); \ SNAME##_node *new_node = PFX##_new_node(element); \
\ \
if (!new_node) \ if (!new_node) \
return false; \ return false; \
\ \
new_node->prev = node->prev; \ new_node->prev = _node_->prev; \
if (node->prev != NULL) \ \
node->prev->next = new_node; \ if (_node_->prev != NULL) \
_node_->prev->next = new_node; \
else \ else \
node->owner->head = new_node; \ _owner_->head = new_node; \
\ \
new_node->next = node; \ new_node->next = _node_; \
node->prev = new_node; \ _node_->prev = new_node; \
\ \
node->owner->count++; \ _owner_->count++; \
\ \
return true; \ return true; \
} \ } \
\ \
FMOD bool PFX##_remove_nxt(SNAME##_node *node) \ FMOD bool PFX##_remove_after(SNAME *_owner_, SNAME##_node *_node_) \
{ \ { \
if (node->next == NULL) \ if (_node_->next == NULL) \
return false; \ return false; \
\ \
SNAME##_node *tmp = node->next; \ SNAME##_node *tmp = _node_->next; \
\ \
if (node->next != NULL) \ if (tmp->next != NULL) \
{ \ { \
node->next = node->next->next; \ _node_->next = _node_->next->next; \
node->next->prev = node; \ _node_->next->prev = _node_; \
} \ } \
else \ else \
node->owner->tail = node; \ _owner_->tail = _node_; \
\
node->owner->count--; \
\ \
free(tmp); \ free(tmp); \
\ \
return true; \ _owner_->count--; \
} \
\
FMOD bool PFX##_remove_cur(SNAME##_node *node) \
{ \
if (node->prev != NULL) \
node->prev->next = node->next; \
else \
node->owner->head = node->next; \
\
if (node->next != NULL) \
node->next->prev = node->prev; \
else \
node->owner->tail = node->prev; \
\
node->owner->count--; \
\
free(node); \
\ \
return true; \ return true; \
} \ } \
\ \
FMOD bool PFX##_remove_prv(SNAME##_node *node) \ FMOD bool PFX##_remove_current(SNAME *_owner_, SNAME##_node *_node_) \
{ \ { \
if (node->prev == NULL) \ if (_node_->prev != NULL) \
_node_->prev->next = _node_->next; \
else \
_owner_->head = _node_->next; \
\
if (_node_->next != NULL) \
_node_->next->prev = _node_->prev; \
else \
_owner_->tail = _node_->prev; \
\
free(_node_); \
\
_owner_->count--; \
\
return true; \
} \
\
FMOD bool PFX##_remove_before(SNAME *_owner_, SNAME##_node *_node_) \
{ \
if (_node_->prev == NULL) \
return false; \ return false; \
\ \
SNAME##_node *tmp = node->prev; \ SNAME##_node *tmp = _node_->prev; \
\ \
if (node->prev != NULL) \ if (tmp->prev != NULL) \
{ \ { \
node->prev = node->prev->prev; \ _node_->prev = _node_->prev->prev; \
node->prev->next = node; \ _node_->prev->next = _node_; \
} \ } \
else \ else \
node->owner->head = node; \ _owner_->head = _node_; \
\ \
free(tmp); \ free(tmp); \
\ \
_owner_->count--; \
\
return true; \ return true; \
} \ } \
\ \
FMOD SNAME##_node *PFX##_next_node(SNAME##_node *node) \ FMOD SNAME##_node *PFX##_next_node(SNAME##_node *_node_) \
{ \ { \
return node->next; \ return _node_->next; \
} \ } \
\ \
FMOD SNAME##_node *PFX##_prev_node(SNAME##_node *node) \ FMOD SNAME##_node *PFX##_prev_node(SNAME##_node *_node_) \
{ \ { \
return node->prev; \ return _node_->prev; \
} \ } \
\ \
FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \ FMOD void PFX##_iter_new(SNAME##_iter *iter, SNAME *target) \