void RosettaCodeProvider::buildHuffTree() { //build Node list from HuffCodeTable, no need to sort (already done on get call) SortedList<HuffNode*> nodeList; int i = 0; HuffData* iterate = _huffCodeTable->get(i); while(iterate != nullptr){ ++i; nodeList.addWithoutSort(new HuffNode(iterate)); iterate = _huffCodeTable->get(i); } //merge nodes together while(nodeList.size() >= 2){ HuffNode* one = nodeList.remove(0); HuffNode* two = nodeList.remove(0); unsigned sum = one->getFrequency() + two->getFrequency(); HuffNode* three = new HuffNode(sum); if(*one < *two){ three->_leftChild = one; three->_rightChild = two; }else{ three->_leftChild = two; three->_rightChild = one; } nodeList.addWithSort(three); } if(nodeList.size() == 0){ //something went wrong //nothing in codeTable to start with? return; } if(nodeList.size() == 1){ _huffTree = new HuffTree(nodeList.remove(0)); } }
SortedList<T>* SortedList<T>::merge(SortedList<T> *t1, SortedList<T> *t2) { int siz1 = t1->size(); int siz2 = t2->size(); int totalSize = siz1 + siz2; int cnt1=0, cnt2=0; SortedList<T>* merged = new SortedList<T>(); for(int i = 0; i < totalSize; i++){ if(cnt1 == siz1){ merged->addWithoutSort(t2->get(cnt2)); ++cnt2; }else if(cnt2 == siz2){ merged->addWithoutSort(t1->get(cnt1)); ++cnt1; }else{ if(std::is_pointer<T>::value){ //dealing with pointer to object //pointer to pointer to object will not work unfortunately T item1 = t1->get(cnt1); T item2 = t2->get(cnt2); if(*(item1) < *(item2)){ merged->addWithoutSort(t1->get(cnt1)); ++cnt1; }else{ merged->addWithoutSort(t2->get(cnt2)); ++cnt2; } }else{ if(t1->get(cnt1) < t2->get(cnt2)){ merged->addWithoutSort(t1->get(cnt1)); ++cnt1; }else{ merged->addWithoutSort(t2->get(cnt2)); ++cnt2; } } } } return merged; }