Возникли проблемы с завершением функции Хаффмана - PullRequest
0 голосов
/ 24 февраля 2019

Моя программа дает сбой, когда я запускаю функцию 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...