I’m making a program on the HUFFMAN ALGORITHM where I have one class of nodes (hnode) to contain the symbol (name) and its frequency of occurence (freq); and other class (pq) which is used to form the tree to get the code for the symbols. I have written only the relevant parts of the classes. Now when I try to run this program it always gets stuck in the while loop (in main()) when it enters the while loop second time. I’ve tried everything but still couldn’t figure out why… Can somebody please help to make this code run !!
#define NPTR hnode*
class pq;
class hnode
{
string name;
int freq;
friend class pq;
public:
NPTR phnode;
void show ()
{ cout << "name = " << name << endl << ", freq= " << freq <<endl ; }
hnode (string x, int fr): name(x), freq(fr)
{
phnode = this;
}
friend hnode operator + (hnode p, hnode q)
{
string s = q.name + p.name;
int f = q.freq + p.freq ;
hnode foo (s,f);
return foo;
}
};
class pq /// ascending priority queue
{
struct node
{
NPTR data;
node* next;
node (NPTR p) : data(p), next(0) {}
};
public:
int count;
node* getnode (NPTR p) { return new node(p); }
node* listptr;
void place (NPTR );
NPTR mindelete();
pq() : listptr(0), count(0) {}
};
void pq::place (NPTR p)
{
if(count == 0)
{
listptr = getnode(p);
}
else
{
node* foo = listptr, *bar = NULL;
while( (foo!= NULL) && (p->freq >= foo->data->freq) )
{
bar = foo;
foo = foo->next;
}
node* ptr = getnode(p);
ptr->next = bar->next;
bar->next = ptr;
}
++count;
}
NPTR pq::mindelete()
{
if(count==0) { cout<<"invalid\n"; exit(1);}
NPTR val = listptr->data;
listptr = listptr->next;
--count;
return val;
}
void main ()
{
pq list;
for ( int i=0; i<3; ++i)
{
string s;
int f;
cin>>s>>f;
NPTR p = new hnode(s,f);
list.place(p);
}
while(list.count>1)
{
NPTR p1 = list.mindelete();
NPTR p2 = list.mindelete();
hnode po = (*p1)+(*p2); // overloaded operator
NPTR p = &po;
p->show();
list.place(p);
}
}
Your code’s creating a locally scoped
hnode poover here:Then you’re passing that around by address and you’re making
pq::nodehold onto that. Sounds like a really bad idea sincehnode pogoes out of scope at the end of your while loop on every iteration.In general, you want to be using smart points and RAII for automated memory management rather than new’ing and delete’ing all over the place.