I'm pretty much done with a program that sorts a list of ints using a heap via a vector but the program will not print the results and I can't figure out whats wrong. Heres the code I have. Thanks.
Code:#include "heap.h" #include <iostream> /*********************************************************** File name: driver.cpp Date: 4/16/08 Developed by: Description: Tests the int heap. ************************************************************/ /* 2 item 1 item already sorted list random list reverse order list */ int main(){ Heap h; list<int> l; //for(int i = 10; i!=0; i--) //l.push_back(i); l.push_back(5); l.push_back(3); l.push_back(2); l.push_back(4); l.push_back(1); h.heap_sort(l,h); for(int i=0; i<(int)l.size();i++) { cout<< l.back()<<"\n"; l.pop_back(); } return 0; }Code:/*********************************************************** File name: heap.cpp Date: 4/16/08 Developed by: Description: Creates a heap using a complete binary tree. ************************************************************/ #include "heap.h" #include <iostream> int Heap::removeHeapRoot(){ CompTree::Position r = t.root(); CompTree::Position last = t.last(); t.swap(r, last); int root = t.remove(); int currentRank = t.root().rank; CompTree::Position n = CompTree::Position(currentRank,&t.v); //while(t.v.at(currentRank)> t.v.at(currentRank*2) || t.v.at(currentRank)> t.v.at(currentRank*2+1)){ //t.isInternal(CompTree::Position(currentRank,&(t.v))); while(t.isInternal(n)){ if(t.v.at(currentRank)> t.v.at(currentRank*2)) { CompTree::Position a = CompTree::Position(currentRank,&t.v); CompTree::Position b = CompTree::Position(currentRank*2,&t.v); t.swap(a,b); currentRank *=2; } else if(t.v.at(currentRank)> t.v.at(currentRank*2+1)) { CompTree::Position c = CompTree::Position(currentRank,&t.v); CompTree::Position d = CompTree::Position(currentRank*2+1,&t.v); t.swap(c,d); currentRank = currentRank*2+1; } CompTree::Position n = CompTree::Position(currentRank,&t.v); //to update loop gaurd. } return root; } CompTree::Position Heap::insert(int x){ t.add(x); int currentRank = t.last().rank; while(t.v.at(currentRank) < t.v.at((int)floor(currentRank/2))){ CompTree::Position a = CompTree::Position(currentRank,&t.v); CompTree::Position b = CompTree::Position((int)floor(currentRank/2),&t.v); t.swap(a,b); currentRank = (int)floor(currentRank/2); } return CompTree::Position(currentRank,&t.v); } int Heap::size(){ return t.size(); } bool Heap::isEmpty(){ return t.isEmpty(); } void Heap::heap_sort(list<int> &l, Heap &h){ for(int i=0; i<(int)l.size();i++) { h.insert(l.front()); l.pop_front(); } for(int i=0; i< h.size(); i++) { l.push_back(h.removeHeapRoot()); } }Code:#ifndef HEAP_H_ #define HEAP_H_ /*********************************************************** File name: heap.h Date: 4/16/08 Developed by: Description: Creates a heap using a complete binary tree. ************************************************************/ #include "compTree.h" #include <list> class Heap{ public: int removeHeapRoot(); //swap last than bubble down CompTree::Position insert(int x); //add last than bubble up int size(); //return compTree.size bool isEmpty(); void heap_sort(list<int> &s, Heap &h); CompTree t; }; #endif /*HEAP_H_*/Code:/*********************************************************** File name: compTree.cpp Date: 4/16/08 Developed by: Description: Creates a binary tree using a vector. ************************************************************/ #include "compTree.h" CompTree::CompTree(){ v.push_back(-1); //set rank 0 to null because the root of the tree starts at rank 1 } CompTree::Position CompTree::add(int x){ v.push_back(x); return last(); } int CompTree::remove(){ int temp = v.back(); v.pop_back(); return temp; } int CompTree::removeRoot(){ v[1]=last().element(); return remove(); } CompTree::Position CompTree::last(){ if(!isEmpty()) return Position(v.size()-1,&v); else return Position(-1, &v); } CompTree::Position CompTree::root(){ if(!isEmpty()) return Position(1,&v); else return Position(-1, &v); } CompTree::Position CompTree::leftChild(Position &p){ if(!isEmpty()) return Position(p.rank*2 ,&v); else return Position(-1, &v); } CompTree::Position CompTree::rightChild(Position &p){ if(!isEmpty()) return Position(p.rank*2+1 ,&v); else return Position(-1, &v); } CompTree::Position CompTree::sibling(Position &p){ int temp = parent(p).rank; if(v.at((int)floor(temp/2))== p.element()) return Position((int)floor(temp/2+1),&v); else return Position((int)floor(temp/2),&v); } CompTree::Position CompTree::parent(Position &p){ return Position((int)floor(p.rank/2) ,&v); } bool CompTree::isInternal(Position &p){ int temp = (int)floor(p.rank*2); if ((int)v.size()>= temp) return true; else return false; } bool CompTree::isExternal(Position &p){ int temp = (int)floor(p.rank*2); if ((int)v.size()>= temp) return false; else return true; } bool CompTree::isEmpty(){ if(v.at(1) != -1) return false; else return true; } void CompTree::swap(Position &p1, Position &p2){ int temp = p1.element(); p1.ptr->at(p1.rank) = p2.element(); p2.ptr->at(p2.rank) = temp; } int CompTree::size(){ return v.size()-1; //because v[0] is not considered part of the tree. } CompTree::~CompTree(){}; CompTree::Position::Position(int r, vector<int> *vp){ rank = r; ptr = vp; } int CompTree::Position::element(){ return ptr->at(rank); } bool CompTree::Position::isNull(){ if(rank == -1) return true; else return false; } CompTree::Position::~Position(){}Code:#ifndef COMPTREE_H_ #define COMPTREE_H_ /*********************************************************** File name: compTree.h Date: 4/16/08 Developed by: Description: Creates a binary tree using a vector. ************************************************************/ #include <vector> #include <math.h> using namespace std; class CompTree { public: class Position; vector<int> v; CompTree(); Position add(int x); Position last(); Position root(); Position leftChild(Position &p); Position rightChild(Position &p); Position sibling(Position &p); Position parent(Position &p); int remove(); int removeRoot(); bool isInternal(Position &p); bool isExternal(Position &p); bool isEmpty(); void swap(Position &p1, Position &p2); int size(); ~CompTree(); class Position { public: Position(int r, vector<int> *vp); int element(); bool isNull(); int rank; vector<int> *ptr; ~Position(); }; }; #endif /*COMPTREE2_H_*/



LinkBack URL
About LinkBacks




)? Once you are finished you can translate that to C++ - I would imagine that the difference would be only in syntax. 