Files
huffman/Huffman/Huffman.cpp
2013-12-08 20:49:17 +01:00

101 lines
2.1 KiB
C++

// Huffman.cpp : Defines the entry point for the console application.
//
#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <string>
#include <cstdlib>
#include <fstream>
#include "DataSet.h"
#include "HElement.h"
#include "DataCharString.h"
HElement * huffman_f(std::vector <DataSet> in){
std::vector<DataSet>::iterator it;
HElement* t;
DataSet * first;
DataSet * second ;
int i;
if (in.size() == 1)
return new HElement ((in[0]));
if (in.size() == 0)
return NULL;
for ( i = in.size() - 1 ; i>0 ; --i){
std::sort(in.begin(), in.begin() + i + 1 ,DataSet::order_dec);
second = &(in[i]);
first = &(in[i - 1]);
t = new HElement (false, * first, * second );
in.erase(in.begin() + i - 1);
in.insert(in.begin() + i - 1 ,DataSet (0,t->getleft_p()->getcore().getfrequency() + t->getright_p()->getcore().getfrequency(),t));
}
return (*(in.begin())).gett_list();
}
void huffman_p (HElement * list, std::vector <DataCharString> * vect , std::string in_s){
if (list != NULL){
if (list->isconcrete()){
DataCharString * t;
t = new DataCharString (list->getcore().getcharacter(),in_s );
(*vect).push_back(*t);
free(t);
}else{
huffman_p (list->getleft_p(),vect, in_s + "0");
huffman_p (list->getright_p(),vect,in_s + "1");
}
}
}
std::vector<DataSet> & read_data (char* file){
try {
std::fstream f (file ,std::ios_base::in );
if (f.good()){
std::vector<DataSet> *ridden_data = new std::vector<DataSet> ();
DataSet * t;
std::vector<DataSet>::iterator it;
for (char input = f.get(); f.good() ; input = f.get() ){
it = std::find((*ridden_data).begin(),(*ridden_data).end(), input );
if ((*ridden_data).size() == 0 || it==(*ridden_data).end()){
t = new DataSet (input,1);
(*ridden_data).push_back (*t);
free(t);
}else{
(*it).increment_frequency();
}
}
return *ridden_data;
}else{
std::cout << "Error reading file" << std::endl;
exit(-1);
}
}
catch ( std::ios_base::failure & e){
std::cout << "Error reading file" << std::endl;
exit(-1);
}
}