Моя текущая программа создает дерево Хаффмана, заполненное узлами символов ascii, которые читаются из текстового файла, а также количество времени, которое они появляются в текстовом файле (частота). Кроме того, он выводит уникальные коды для каждого прочитанного символа на основе частоты, это делается с помощью моей функции перемещения.
Моя проблема: у меня есть этот строковый массив, который может содержать коды для всех 256 значений ascii в моей функции Хаффмана, для которой по умолчанию задана пустая строка для каждого элемента. Я пытался обновить мой массив путем передачи параметра в мою функцию перемещения, но это выдает ошибку.
Код E0413 - «Не существует подходящего преобразования из std :: string в char»
Части моего кода ниже вместе с некоторыми объяснениями переменных в моей функции обхода:
'символ' - это символ, который был найден в текстовом файле
«частота» - это количество раз, которое символ читается в текстовом файле
'traversecode' - код Хаффмана, генерируемый функцией traverse
Я также закомментировал строки в моей функции перемещения, где я получаю ошибку.
struct node {
int frequency;
char character;
const node *child0;
const node *child1;
node(unsigned char c = 0, int i = -1) {
character = c;
frequency = i;
child0 = 0;
child1 = 0;
}
node(const node* c0, const node *c1) {
character = 0;
frequency = c0->frequency + c1->frequency;
child0 = c0;
child1 = c1;
}
bool operator<(const node &a) const {
return frequency > a.frequency;
}
void traverse(string codearray[256], string traversecode = "") const {
if (child0) {
child0->traverse(traversecode + '0'); // one line throwing the error
child1->traverse(traversecode + '1'); // second line that throws me the error
}
else {
codearray[int(character)] = traversecode;
cout << " " << character << " ";
cout << frequency;
cout << " " << traversecode << endl;
}
}
};
функция Хаффмана (функция, которая содержит массив, который я бы хотел обновить)
void huffman(string code[256], const unsigned long long frequency[256]) {
priority_queue < node > q;
for (unsigned i = 0; i < 256; i++) {
if (frequency[i] == 0) {
code[i] = "";
}
}
for (int i = 0; i < 256; i++)
if (frequency[i])
q.push(node(i, frequency[i]));
while (q.size() > 1) {
node *child0 = new node(q.top());
q.pop();
node *child1 = new node(q.top());
q.pop();
q.push(node(child0, child1));
}
cout << "CHAR FREQUENCY HUFFMAN CODE" << endl;
q.top().traverse(code);
}