diff options
Diffstat (limited to 'src/lib/ll.c')
-rw-r--r-- | src/lib/ll.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/lib/ll.c b/src/lib/ll.c index 4eaa291..4918194 100644 --- a/src/lib/ll.c +++ b/src/lib/ll.c @@ -13,13 +13,24 @@ struct LL* new_ll(void* val) void push_ll(struct LL* l, void* val) { struct LL* ll = (struct LL*)malloc(sizeof(struct LL)); + l->prev->next = ll; ll->prev = l->prev; ll->next = l; - ll->prev->next = ll; l->prev = ll; ll->data = val; } +void pop_ll(struct LL* l) +{ + if ((l->prev == l->next) && (l->prev == l)) + l->data = 0; + else { + l->prev->next = l->next; + l->next->prev = l->prev; + free(l); + } +} + void remove_ll(struct LL* l, unsigned long idx) { struct LL* t = l; @@ -30,3 +41,17 @@ void remove_ll(struct LL* l, unsigned long idx) t->next->prev = t->prev; free(t); } + +unsigned long length_ll(struct LL* l) +{ + struct LL* t = l; + unsigned long len = 0; + while (1) { + if (t->next == l) { + return len; + } + len++; + t = t->next; + } + return len; +} |