Hi. I just wrote the traverse function. No compile-time errors. The program crashes at run-time. Any idea why? I thought it should work. Thanks always, Steve
Code:
#include<iostream>
#include<vector>
#include<fstream>
#include<stack>
using namespace std;
struct Huff;
void deletePtr(vector<Huff*>& v, Huff* m);
Huff* findMinimum(vector<Huff*>& v);
void traverse(vector<Huff*>& v);
struct Huff
{
Huff();
int count;
char ch;
Huff* left;
Huff* right;
Huff* parent;
};
int main(int argc, char* argv[])
{
if(argc<2)
{
cout<<"Not enough arguments were provided."<<endl;
return -1;
}
ifstream myFile(argv[1], ios::in);
if(!myFile.is_open())
{
cout<<"Unknown file specified."<<endl;
return -1;
}
char cz;
int i;
vector<Huff*> values;
while(myFile.get(cz))
{
if(cz < 'a' || cz > 'z')
continue;
for(i=0; i<values.size(); i++)
{
if(values[i]->ch == cz)
{
values[i]->count++;
break;
}
}
if(values.size()==i)
{
Huff* h = new Huff;
h->ch=cz;
h->count=1;
values.push_back(h);
}
}
if(values.size() == 0)
{
cout<<"File is empty.\n";
return 0;
}
if(values.size() == 1)
{
cout<<values[0]->ch<<"1"<<endl;
}
vector<Huff*> copy;
for(i=0; i<values.size(); i++)
{
copy.push_back(values[i]);
}
Huff* min;
Huff* min2;
while(values.size() > 1)
{
min=findMinimum(values);
deletePtr(values, min);
min2=findMinimum(values);
deletePtr(values, min2);
Huff* p=new Huff;
p->left=min;
p->right=min2;
p->count=min->count+min2->count;
values.push_back(p);
}
traverse(copy);
return 0;
}
Huff::Huff() : ch(0), count(0) { }
Huff* findMinimum(vector<Huff*>& v)
{
int i, minCo=v[0]->count;
char minCh=v[0]->ch;
Huff* h3=v[0];
for(i=1; i<v.size(); i++)
{
if(v[i]->count < minCo)
{
minCo=v[i]->count;
minCh=v[i]->ch;
h3=v[i];
}
}
return h3;
}
void deletePtr(vector<Huff*>& v, Huff* m)
{
int i;
i=0;
while(i < v.size() && v[i]->ch != m->ch)
{
i++;
}
for( ; i<v.size()-1; i++)
{
v[i]=v[i+1];
}
v.pop_back();
}
void traverse(vector<Huff*>& v)
{
int i;
Huff* p;
stack<int> s;
for(i=0; i<v.size(); i++)
{
p=v[i];
while(p->parent != NULL)
{
p=p->parent;
if(p->left->ch == v[i]->ch)
{
s.push(0);
}
else
{
s.push(1);
}
}
cout<<v[i]->ch<<" ";
while(!s.empty())
{
cout<<s.top();
s.pop();
}
}
}