4 #include <rudiments/stdio.h>
5 #include <rudiments/private/nodeinlines.h>
7 #define SINGLYLINKEDLIST_TEMPLATE template <class valuetype>
9 #define SINGLYLINKEDLIST_CLASS singlylinkedlist<valuetype>
11 SINGLYLINKEDLIST_TEMPLATE
13 SINGLYLINKEDLIST_CLASS::singlylinkedlist() {
19 SINGLYLINKEDLIST_TEMPLATE
21 SINGLYLINKEDLIST_CLASS::~singlylinkedlist() {
25 SINGLYLINKEDLIST_TEMPLATE
27 void SINGLYLINKEDLIST_CLASS::prepend(valuetype value) {
31 SINGLYLINKEDLIST_TEMPLATE
46 SINGLYLINKEDLIST_TEMPLATE
48 void SINGLYLINKEDLIST_CLASS::append(valuetype value) {
52 SINGLYLINKEDLIST_TEMPLATE
67 SINGLYLINKEDLIST_TEMPLATE
69 void SINGLYLINKEDLIST_CLASS::insertAfter(
75 SINGLYLINKEDLIST_TEMPLATE
77 void SINGLYLINKEDLIST_CLASS::insertAfter(
82 }
else if (node==last) {
85 newnode->setNext(node->
getNext());
86 node->setNext(newnode);
91 SINGLYLINKEDLIST_TEMPLATE
93 void SINGLYLINKEDLIST_CLASS::moveAfter(
97 if (!node || !nodetomove || node==nodetomove) {
101 if (nodetomove==first) {
103 }
else if (nodetomove==last) {
105 while (secondtolast->
getNext()!=last) {
106 secondtolast=secondtolast->
getNext();
109 secondtolast->setNext(NULL);
112 while (previous->getNext()!=nodetomove) {
113 previous=previous->getNext();
115 previous->setNext(nodetomove->
getNext());
118 nodetomove->setNext(node->
getNext());
119 node->setNext(nodetomove);
125 SINGLYLINKEDLIST_TEMPLATE
129 if (node==first && node==last) {
132 }
else if (node==first) {
134 }
else if (node==last) {
136 while (secondtolast->
getNext()!=last) {
137 secondtolast=secondtolast->
getNext();
140 secondtolast->setNext(NULL);
143 while (previous->getNext()!=node) {
144 previous=previous->getNext();
146 previous->setNext(node->
getNext());
152 SINGLYLINKEDLIST_TEMPLATE
154 bool SINGLYLINKEDLIST_CLASS::remove(valuetype value) {
156 if (!current->
compare(value)) {
161 first=first->getNext();
167 if (!current->
compare(value)) {
168 prev->setNext(current->
getNext());
186 SINGLYLINKEDLIST_TEMPLATE
188 bool SINGLYLINKEDLIST_CLASS::removeAndDelete(valuetype value) {
190 if (!current->
compare(value)) {
195 first=first->getNext();
201 if (!current->
compare(value)) {
202 prev->setNext(current->
getNext());
221 SINGLYLINKEDLIST_TEMPLATE
223 bool SINGLYLINKEDLIST_CLASS::removeAndArrayDelete(valuetype value) {
225 if (!current->
compare(value)) {
230 first=first->getNext();
236 if (!current->
compare(value)) {
237 prev->setNext(current->
getNext());
256 SINGLYLINKEDLIST_TEMPLATE
258 bool SINGLYLINKEDLIST_CLASS::removeAll(valuetype value) {
264 while (!current->
compare(value)) {
273 first=first->getNext();
282 if (!current->
compare(value)) {
301 SINGLYLINKEDLIST_TEMPLATE
303 bool SINGLYLINKEDLIST_CLASS::removeAllAndDelete(valuetype value) {
309 while (!current->
compare(value)) {
319 first=first->getNext();
329 if (!current->
compare(value)) {
349 SINGLYLINKEDLIST_TEMPLATE
351 bool SINGLYLINKEDLIST_CLASS::removeAllAndArrayDelete(valuetype value) {
357 while (!current->
compare(value)) {
367 first=first->getNext();
377 if (!current->
compare(value)) {
397 SINGLYLINKEDLIST_TEMPLATE
409 first=first->getNext();
416 prev->setNext(current->
getNext());
434 SINGLYLINKEDLIST_TEMPLATE
436 bool SINGLYLINKEDLIST_CLASS::removeAndDelete(
447 first=first->getNext();
454 prev->setNext(current->
getNext());
473 SINGLYLINKEDLIST_TEMPLATE
475 bool SINGLYLINKEDLIST_CLASS::removeAndArrayDelete(
486 first=first->getNext();
493 prev->setNext(current->
getNext());
512 SINGLYLINKEDLIST_TEMPLATE
514 uint64_t SINGLYLINKEDLIST_CLASS::getLength()
const {
518 SINGLYLINKEDLIST_TEMPLATE
524 SINGLYLINKEDLIST_TEMPLATE
530 SINGLYLINKEDLIST_TEMPLATE
534 return (node)?node->
getNext():NULL;
537 SINGLYLINKEDLIST_TEMPLATE
543 SINGLYLINKEDLIST_TEMPLATE
549 current; current=current->
getNext()) {
550 if (!current->
compare(value)) {
557 SINGLYLINKEDLIST_TEMPLATE
559 void SINGLYLINKEDLIST_CLASS::insertionSort() {
593 if (newfirst->
compare(node)>0) {
594 node->setNext(newfirst);
600 if (newlast->
compare(node)<=0) {
602 newlast->setNext(node);
614 if (current->
compare(node)>0) {
617 node->setNext(current);
618 previous->setNext(node);
637 SINGLYLINKEDLIST_TEMPLATE
639 void SINGLYLINKEDLIST_CLASS::heapSort() {
662 uint64_t child=heapend;
666 uint64_t parent=(child-1)/2;
669 if (heap[parent]->compare(heap[child])<0) {
671 heap[parent]=heap[child];
709 node->setNext(newfirst);
727 heap[0]=heap[heapend];
736 uint64_t leftchild=parent*2+1;
737 if (leftchild>heapend) {
742 uint64_t greater=parent;
743 if (heap[parent]->compare(heap[leftchild])<0) {
748 uint64_t rightchild=leftchild+1;
749 if (rightchild<=heapend &&
750 heap[rightchild]->compare(heap[greater])>0) {
756 if (greater==parent) {
764 heap[parent]=heap[greater];
779 SINGLYLINKEDLIST_TEMPLATE
781 void SINGLYLINKEDLIST_CLASS::clear() {
794 SINGLYLINKEDLIST_TEMPLATE
796 void SINGLYLINKEDLIST_CLASS::clearAndDelete() {
810 SINGLYLINKEDLIST_TEMPLATE
812 void SINGLYLINKEDLIST_CLASS::clearAndArrayDelete() {
826 SINGLYLINKEDLIST_TEMPLATE
828 void SINGLYLINKEDLIST_CLASS::print()
const {
832 SINGLYLINKEDLIST_TEMPLATE
834 void SINGLYLINKEDLIST_CLASS::print(uint64_t count)
const {
837 current && i<count; current=current->
getNext()) {
838 #ifdef RUDIMENTS_HAVE_LONG_LONG
839 stdoutput.
printf(
"index %lld: ",(
long long)i);
841 stdoutput.
printf(
"index %ld: ",(
long)i);
849 #define SINGLYLINKEDLISTNODE_TEMPLATE template <class valuetype>
851 #define SINGLYLINKEDLISTNODE_CLASS singlylinkedlistnode<valuetype>
853 SINGLYLINKEDLISTNODE_TEMPLATE
855 SINGLYLINKEDLISTNODE_CLASS::singlylinkedlistnode(valuetype value) {
860 SINGLYLINKEDLISTNODE_TEMPLATE
862 SINGLYLINKEDLISTNODE_CLASS::~singlylinkedlistnode() {
865 SINGLYLINKEDLISTNODE_TEMPLATE
867 void SINGLYLINKEDLISTNODE_CLASS::setValue(valuetype value) {
871 SINGLYLINKEDLISTNODE_TEMPLATE
873 valuetype SINGLYLINKEDLISTNODE_CLASS::getValue()
const {
877 SINGLYLINKEDLISTNODE_TEMPLATE
879 SINGLYLINKEDLISTNODE_CLASS *SINGLYLINKEDLISTNODE_CLASS::getNext() {
883 SINGLYLINKEDLISTNODE_TEMPLATE
885 int32_t SINGLYLINKEDLISTNODE_CLASS::compare(valuetype value)
const {
886 return node_compare(this->value,value);
889 SINGLYLINKEDLISTNODE_TEMPLATE
891 int32_t SINGLYLINKEDLISTNODE_CLASS::compare(
893 return node_compare(this->value,peer->value);
896 SINGLYLINKEDLISTNODE_TEMPLATE
898 void SINGLYLINKEDLISTNODE_CLASS::print()
const {
902 SINGLYLINKEDLISTNODE_TEMPLATE
904 void SINGLYLINKEDLISTNODE_CLASS::setNext(SINGLYLINKEDLISTNODE_CLASS *next) {
size_t printf(const char *format,...)
Definition: singlylinkedlist.h:12
valuetype getValue() const
int32_t compare(valuetype value) const
singlylinkedlistnode< valuetype > * getNext()