Моя программа дает сбой, когда я запускаю функцию huffman в основном с тем, что у меня есть.Цель функции - установить каждую строку кода [] (массив, передаваемый в функцию Хаффмана) так, чтобы код представлял оптимальный код Хаффмана.huffman получает частоту символов в текстовом файле через функцию getFreq, описанную ниже.(Существует более одного правильного кода, потому что обычно есть связь для того, что является оптимальным.) Для символов, которые не появляются в файле (поэтому элемент freq равен 0), просто установите соответствующую строку в пустую строку: "".Напишите main, который передает имя файла в getFreq, передает freq arry в huffman и выводит код Huffman.Ниже то, что я имею до сих пор.Вся помощь приветствуется.
#include <iostream>
#include <cstdlib>
#include <string>
#include<conio.h>
#include <fstream>
#include <new>
using namespace std;
struct Node {
Node * left;
char n;
string s;
Node * right;
};
bool die(const string & msg);
Node * getNode(char n) {
Node * ret = nullptr;
try {
ret = new Node;
ret->left = ret->right = nullptr;
ret->n = n;
}
catch (const bad_alloc &) {
die("allocation failrure");
}
return ret;
}
void getFreq(unsigned long long freq[256], const string & fileName);
void huffman(string code[256], const unsigned long long freq[256]);
void traverse1(Node * r) {
if (r) {
traverse1(r->left);
cout << r->n << endl;
traverse1(r->right);
}
}
void traverse2(Node * r) {
static string s;
if (!r) return;
cout << r->n << " " << s << endl;
s += '0';
traverse2(r->left);
s[s.size() - 1] = '1';
traverse2(r->right);
s.pop_back();
}
bool in(Node * r, char n) { // return whether n is in the tree
if (r == nullptr) return false;
if (n < r->n) return in(r->left, n);
if (n == r->n) return true;
return in(r->right, n);
}
void insert(Node * & r, char n) {
if (r == nullptr) {
r = getNode(n);
}
else {
if (n < r->n)
insert(r->left, n);
else if (n > r->n)
insert(r->right, n);
}
}
void dealloc(Node * r) {
if (r) {
dealloc(r->left);
delete r; cout << '.';
dealloc(r->right);
}
}
int main() {
unsigned long long freq[256];//array to store frequency
string code[256]; //array to store string codes
char fname[100];//array to read a file name
cout << "Enter file name : ";
cin >> fname; //filename from user
getFreq(freq, fname);//call to the function
cout << char(10) << " " << freq[10] << endl;
huffman(code, freq);
}
void getFreq(unsigned long long freq[256], const string & fileName) {
ifstream ifile;//to read file
ifile.open(fileName, ios::in | ios::binary); //open file in input and binary mode
if (!ifile)//to check if file is open or not
{
cout << "Error in opening file..!!";
exit(0);
}
int i = 0;
//initialize frequency array values to 0
for (i = 0; i < 256; i++) {
freq[i] = 0;
}
int read;
read = ifile.get();//read one char from file and store it in int
while (read != -1) {//run this loop until reached to end of file(-1)
//cout<<read<<" ";
freq[read]++;//increase the frequency for the current character
read = ifile.get();//read next character
}
/*
for (i = 0; i < 256; i++) {
cout << i << " " << freq[i] << " ";
} // output */
ifile.close();//close the file
}
void huffman(string code[256], const unsigned long long freq[256]) {
Node * r = nullptr;
for (int i = 0; i < 256; i++) {
if (freq[i] == 0)
code[i] = "";
else {
insert(r, char(i));
}
}
traverse1(r);
traverse2(r);
dealloc(r);
}
bool die(const string & msg) {
cout << "Fatal Error:" << msg << endl;
exit(EXIT_FAILURE);
}