linked-list.h
| 1 | #ifndef LINKED_LIST_H |
| 2 | #define LINKED_LIST_H |
| 3 | |
| 4 | #include <cutils/common.h> |
| 5 | #include <stdlib.h> |
| 6 | |
| 7 | typedef struct SLnode |
| 8 | { |
| 9 | void* item; |
| 10 | struct SLnode* next; |
| 11 | } SLnode; |
| 12 | |
| 13 | typedef struct DLnode |
| 14 | { |
| 15 | void* item; |
| 16 | struct DLnode* next; |
| 17 | struct DLnode* prev; |
| 18 | } DLnode; |
| 19 | |
| 20 | typedef struct LinkedList |
| 21 | { |
| 22 | void* head; /*SLnode if doubly_linked is false, otherwise DLnode*/ |
| 23 | void* tail; |
| 24 | size_t length; |
| 25 | bool_t doubly_linked; |
| 26 | bool_t circularly_linked; |
| 27 | } LinkedList; |
| 28 | |
| 29 | LinkedList* new_ll(bool_t doubly_linked, bool_t circularly_linked); |
| 30 | |
| 31 | void delete_sll(LinkedList* ll, void(*rmv) (void*)); |
| 32 | void delete_dll(LinkedList* ll, void(*rmv) (void*)); |
| 33 | HEDLEY_INLINE |
| 34 | static void delete_ll(LinkedList* ll, void(*rmv) (void*)) |
| 35 | { |
| 36 | if(ll->doubly_linked) |
| 37 | delete_dll(ll, rmv); |
| 38 | else |
| 39 | delete_sll(ll, rmv); |
| 40 | } |
| 41 | |
| 42 | void* sll_at(const LinkedList* ll, size_t index); |
| 43 | void* dll_at(const LinkedList* ll, size_t index); |
| 44 | HEDLEY_INLINE |
| 45 | static void* ll_at(const LinkedList* ll, size_t index) |
| 46 | { |
| 47 | if(ll->doubly_linked) |
| 48 | return sll_at(ll, index); |
| 49 | else |
| 50 | return dll_at(ll, index); |
| 51 | } |
| 52 | #define ll_pop(ll) ll_pop_at(ll, ll->length-1) |
| 53 | void* sll_pop_at(LinkedList* ll, size_t index); |
| 54 | void* dll_pop_at(LinkedList* ll, size_t index); |
| 55 | HEDLEY_INLINE |
| 56 | static void* ll_pop_at(LinkedList* ll, size_t index) |
| 57 | { |
| 58 | if(ll->doubly_linked) |
| 59 | return sll_pop_at(ll, index); |
| 60 | else |
| 61 | return dll_pop_at(ll, index); |
| 62 | } |
| 63 | |
| 64 | #define ll_push(ll, item) ll_insert(ll, ll->length, item) |
| 65 | bool_t sll_insert(LinkedList* ll, size_t index, void* item); |
| 66 | bool_t dll_insert(LinkedList* ll, size_t index, void* item); |
| 67 | HEDLEY_INLINE |
| 68 | static bool_t ll_insert(LinkedList* ll, size_t index, void* item) |
| 69 | { |
| 70 | if(ll->doubly_linked) |
| 71 | return sll_insert(ll, index, item); |
| 72 | else |
| 73 | return dll_insert(ll, index, item); |
| 74 | } |
| 75 | |
| 76 | |
| 77 | void sll_remove(LinkedList* ll, size_t index, void (*rmv)(void*)); |
| 78 | void dll_remove(LinkedList* ll, size_t index, void (*rmv)(void*)); |
| 79 | HEDLEY_INLINE |
| 80 | static void ll_remove(LinkedList* ll, size_t index, void (*rmv)(void*)) |
| 81 | { |
| 82 | if(ll->doubly_linked) |
| 83 | sll_remove(ll, index, rmv); |
| 84 | else |
| 85 | dll_remove(ll, index, rmv); |
| 86 | } |
| 87 | void sll_remove_range(LinkedList* ll, size_t index, size_t length, void (*rmv)(void*)); |
| 88 | void dll_remove_range(LinkedList* ll, size_t index, size_t length, void (*rmv)(void*)); |
| 89 | HEDLEY_INLINE |
| 90 | static void ll_remove_range(LinkedList* ll, size_t index, size_t length, void (*rmv)(void*)) |
| 91 | { |
| 92 | if(ll->doubly_linked) |
| 93 | sll_remove_range(ll, index, length, rmv); |
| 94 | else |
| 95 | dll_remove_range(ll, index, length, rmv); |
| 96 | } |
| 97 | |
| 98 | size_t* sll_find(const LinkedList* haystack, const void* needle, int (*cmp)(const void*, const void*)); |
| 99 | size_t* dll_find(const LinkedList* haystack, const void* needle, int (*cmp)(const void*, const void*)); |
| 100 | HEDLEY_INLINE |
| 101 | static size_t* ll_find(const LinkedList* haystack, const void* needle, int (*cmp)(const void*, const void*)) |
| 102 | { |
| 103 | if(haystack->doubly_linked) |
| 104 | return sll_find(haystack, needle, cmp); |
| 105 | else |
| 106 | return dll_find(haystack, needle, cmp); |
| 107 | } |
| 108 | void sll_swap(LinkedList* ll, size_t item1, size_t item2); |
| 109 | void dll_swap(LinkedList* ll, size_t item1, size_t item2); |
| 110 | HEDLEY_INLINE |
| 111 | static void ll_swap(LinkedList* ll, size_t item1, size_t item2) |
| 112 | { |
| 113 | if(ll->doubly_linked) |
| 114 | sll_swap(ll, item1, item2); |
| 115 | else |
| 116 | dll_swap(ll, item1, item2); |
| 117 | } |
| 118 | |
| 119 | |
| 120 | #endif /* LINKED_LIST_H */ |
| 121 |