Fork of Sam Grove's Linked list library OS6 compliant.
LinkedList2.cpp@0:27649dfdde4c, 2020-12-29 (annotated)
- Committer:
- star297
- Date:
- Tue Dec 29 13:07:51 2020 +0000
- Revision:
- 0:27649dfdde4c
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
star297 | 0:27649dfdde4c | 1 | |
star297 | 0:27649dfdde4c | 2 | #include "LinkedList2.h" |
star297 | 0:27649dfdde4c | 3 | |
star297 | 0:27649dfdde4c | 4 | template<class retT> |
star297 | 0:27649dfdde4c | 5 | LinkedList2<retT>::LinkedList2() |
star297 | 0:27649dfdde4c | 6 | { |
star297 | 0:27649dfdde4c | 7 | _head = 0; |
star297 | 0:27649dfdde4c | 8 | return; |
star297 | 0:27649dfdde4c | 9 | } |
star297 | 0:27649dfdde4c | 10 | |
star297 | 0:27649dfdde4c | 11 | template<class retT> |
star297 | 0:27649dfdde4c | 12 | LinkedList2<retT>::~LinkedList2() |
star297 | 0:27649dfdde4c | 13 | { |
star297 | 0:27649dfdde4c | 14 | while(remove(1) != NULL); |
star297 | 0:27649dfdde4c | 15 | return; |
star297 | 0:27649dfdde4c | 16 | } |
star297 | 0:27649dfdde4c | 17 | |
star297 | 0:27649dfdde4c | 18 | template<class retT> |
star297 | 0:27649dfdde4c | 19 | retT *LinkedList2<retT>::push(void *data) |
star297 | 0:27649dfdde4c | 20 | { |
star297 | 0:27649dfdde4c | 21 | retT *new_node = new retT [1]; |
star297 | 0:27649dfdde4c | 22 | if (0 == new_node) |
star297 | 0:27649dfdde4c | 23 | { |
star297 | 0:27649dfdde4c | 24 | error("Memory allocation failed\n"); |
star297 | 0:27649dfdde4c | 25 | } |
star297 | 0:27649dfdde4c | 26 | new_node->next = _head; |
star297 | 0:27649dfdde4c | 27 | new_node->data = data; |
star297 | 0:27649dfdde4c | 28 | _head = new_node; |
star297 | 0:27649dfdde4c | 29 | return _head; |
star297 | 0:27649dfdde4c | 30 | } |
star297 | 0:27649dfdde4c | 31 | |
star297 | 0:27649dfdde4c | 32 | template<class retT> |
star297 | 0:27649dfdde4c | 33 | retT *LinkedList2<retT>::append(void *data) |
star297 | 0:27649dfdde4c | 34 | { |
star297 | 0:27649dfdde4c | 35 | retT *current = _head; |
star297 | 0:27649dfdde4c | 36 | retT *new_node = new retT [1]; |
star297 | 0:27649dfdde4c | 37 | if (0 == new_node) |
star297 | 0:27649dfdde4c | 38 | { |
star297 | 0:27649dfdde4c | 39 | error("Memory allocation failed\n"); |
star297 | 0:27649dfdde4c | 40 | } |
star297 | 0:27649dfdde4c | 41 | new_node->data = data; |
star297 | 0:27649dfdde4c | 42 | new_node->next = 0; |
star297 | 0:27649dfdde4c | 43 | if (0 == current) |
star297 | 0:27649dfdde4c | 44 | { |
star297 | 0:27649dfdde4c | 45 | _head = new_node; |
star297 | 0:27649dfdde4c | 46 | return _head; |
star297 | 0:27649dfdde4c | 47 | } |
star297 | 0:27649dfdde4c | 48 | else |
star297 | 0:27649dfdde4c | 49 | { |
star297 | 0:27649dfdde4c | 50 | while (current->next != 0) |
star297 | 0:27649dfdde4c | 51 | { |
star297 | 0:27649dfdde4c | 52 | current = current->next; |
star297 | 0:27649dfdde4c | 53 | } |
star297 | 0:27649dfdde4c | 54 | current->next = new_node; |
star297 | 0:27649dfdde4c | 55 | } |
star297 | 0:27649dfdde4c | 56 | |
star297 | 0:27649dfdde4c | 57 | return current->next; |
star297 | 0:27649dfdde4c | 58 | } |
star297 | 0:27649dfdde4c | 59 | |
star297 | 0:27649dfdde4c | 60 | template<class retT> |
star297 | 0:27649dfdde4c | 61 | retT *LinkedList2<retT>::remove(uint32_t loc) |
star297 | 0:27649dfdde4c | 62 | { |
star297 | 0:27649dfdde4c | 63 | retT *current = _head; |
star297 | 0:27649dfdde4c | 64 | retT *prev = 0; |
star297 | 0:27649dfdde4c | 65 | if ((loc <= length()) && (loc > 0)) |
star297 | 0:27649dfdde4c | 66 | { |
star297 | 0:27649dfdde4c | 67 | if (1 == loc) |
star297 | 0:27649dfdde4c | 68 | { |
star297 | 0:27649dfdde4c | 69 | _head = current->next; |
star297 | 0:27649dfdde4c | 70 | delete [] current; |
star297 | 0:27649dfdde4c | 71 | } |
star297 | 0:27649dfdde4c | 72 | else |
star297 | 0:27649dfdde4c | 73 | { |
star297 | 0:27649dfdde4c | 74 | for (uint32_t i=2; i<=loc; ++i) |
star297 | 0:27649dfdde4c | 75 | { |
star297 | 0:27649dfdde4c | 76 | prev = current; |
star297 | 0:27649dfdde4c | 77 | current = current->next; |
star297 | 0:27649dfdde4c | 78 | } |
star297 | 0:27649dfdde4c | 79 | prev->next = current->next; |
star297 | 0:27649dfdde4c | 80 | delete [] current; |
star297 | 0:27649dfdde4c | 81 | } |
star297 | 0:27649dfdde4c | 82 | } |
star297 | 0:27649dfdde4c | 83 | |
star297 | 0:27649dfdde4c | 84 | return _head; |
star297 | 0:27649dfdde4c | 85 | } |
star297 | 0:27649dfdde4c | 86 | |
star297 | 0:27649dfdde4c | 87 | template<class retT> |
star297 | 0:27649dfdde4c | 88 | retT *LinkedList2<retT>::pop(uint32_t loc) |
star297 | 0:27649dfdde4c | 89 | { |
star297 | 0:27649dfdde4c | 90 | retT *current = _head; |
star297 | 0:27649dfdde4c | 91 | if ((loc > length()) || (loc == 0)) |
star297 | 0:27649dfdde4c | 92 | { |
star297 | 0:27649dfdde4c | 93 | return 0; |
star297 | 0:27649dfdde4c | 94 | } |
star297 | 0:27649dfdde4c | 95 | for (uint32_t i=2; i<=loc; ++i) |
star297 | 0:27649dfdde4c | 96 | { |
star297 | 0:27649dfdde4c | 97 | current = current->next; |
star297 | 0:27649dfdde4c | 98 | } |
star297 | 0:27649dfdde4c | 99 | return current; |
star297 | 0:27649dfdde4c | 100 | } |
star297 | 0:27649dfdde4c | 101 | |
star297 | 0:27649dfdde4c | 102 | template<class retT> |
star297 | 0:27649dfdde4c | 103 | uint32_t LinkedList2<retT>::length(void) |
star297 | 0:27649dfdde4c | 104 | { |
star297 | 0:27649dfdde4c | 105 | int32_t count = 0; |
star297 | 0:27649dfdde4c | 106 | retT *current = _head; |
star297 | 0:27649dfdde4c | 107 | while (current != 0) |
star297 | 0:27649dfdde4c | 108 | { |
star297 | 0:27649dfdde4c | 109 | ++count; |
star297 | 0:27649dfdde4c | 110 | current = current->next; |
star297 | 0:27649dfdde4c | 111 | } |
star297 | 0:27649dfdde4c | 112 | return count; |
star297 | 0:27649dfdde4c | 113 | } |
star297 | 0:27649dfdde4c | 114 | template class LinkedList2<node>; |