Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
AndreySeVeN
2 / 2 / 2
Регистрация: 06.06.2014
Сообщений: 156
Записей в блоге: 1
#1

Дерево Хаффмана и файл - C++

05.10.2017, 18:28. Просмотров 171. Ответов 1
Метки нет (Все метки)

Записал в двоичный(!) файл прямым методом дерево хаффмана...
выглядит след. образом: количество записей(Node), и сами Ноды формата H/L/R_символ_вероятность (символы "/ и _" не записываются в файл, это просто разделители для наглядности)
H - заголовок (что бы читать по N байт, потом уберу)
L - влево
R - вправо

И вот надо теперь прочитать это дерево, но почему то это не выходит. Код читалки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void readTreeNodes(ifstream &in, int &nodesCount, Node *node) {
    if (nodesCount <= 0) return;    
    char to, c;
    int a;
    in.read((char*)&to, 1);
    in.read((char*)&c, 1);
    in.read((char*)&a, 4);
    
    cout << to << ":" << (int)c << ':' << a << endl;
 
    Node *newNode = new Node({c, a});
    newNode->prev = node;
    
    if (to == 'L') {
        node->left = newNode;
        readTreeNodes(in, --nodesCount, node->left);
    }
    else if (to == 'R') {
        /*while (node->prev->right != nullptr){
            node = node->prev;
            //Вот тут ошибка кажется возникает, этот цикл впадает в бесконечность, хотя не должен!
        }*/
        node->prev->right = newNode;
        readTreeNodes(in, --nodesCount, node->prev);
    }
}
Класс Node:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Node {
public:
    int a = 0;
    char c = 0;
    Node *prev = nullptr; // для читалки из файла
    Node *left = nullptr, *right = nullptr;
    Node() {}
 
    Node(Node *L, Node *R) {
        left = L;
        right = R;
        a = L->a + R->a;
    }
 
    explicit Node(pair<char, int> p) {
        c = p.first;
        a = p.second;
    }
};
Я могу сделать это и другим способом, но мне нужно именно так по ТЗ
В коде читалки в else if R есть комментарий, где я пытался починить функцию, но это не удалось
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2017, 18:28
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Дерево Хаффмана и файл (C++):

Код Хаффмана
Люди подскажите, что это за зверь? и как его реализовать на с?

Кодирование Хаффмана
Помогите написать программу для кодирования и декодирования строк вида &quot;a_!slf&quot;...

Оптимизация алгоритма Хаффмана
Сделал архиватор, но работает он запредельно долго ~ 30 мин на папку размером...

Исходник алгоритма Хаффмана на C
Пожалуйсто дайте исходник алгоритма Хаффмана на C.

Метод сжатия Хаффмана
Есть Метод сжатия Хаффмана или нет и как его использовать ? покажите если...

Метод сжатия Хаффмана
Ктонибуть ответит по существу по теме ?

1
AndreySeVeN
2 / 2 / 2
Регистрация: 06.06.2014
Сообщений: 156
Записей в блоге: 1
08.10.2017, 12:42  [ТС] #2
Тема закрыта
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void readTreeNodes(ifstream &in, int &nodesCount, Node *node) {
    if (nodesCount <= 0) return;    
    char to, c;
    int a;
    in.read((char*)&to, 1);
    in.read((char*)&c, 1);
    in.read((char*)&a, 4);
    
    if (to == 'L') {
        node->left = new Node(make_pair(c, a));
        node->left->prev = node;
        readTreeNodes(in, --nodesCount, node->left);
    }
    else if (to == 'R') {
        while (node->prev->right != nullptr) {
            node = node->prev;
        }
        node->prev->right = new Node(make_pair(c, a));
        node->prev->right->prev = node->prev;
        readTreeNodes(in, --nodesCount, node->prev->right);
    }
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2017, 12:42
Привет! Вот еще темы с решениями:

Дерево Хаффмана
Здравствуйте. Хотел узнать как работает дерево Хаффмана и 4 дня изучал...

Дерево Хаффмана
Помогите пожалуйста, всё никак не получается написать подпрограмму, создающую...

Дерево Хаффмана
Всем доброго времени суток! Очень прошу мне помочь! Мне нужно написать...

Двоичное дерево Хаффмана
Дана некоторая последовательность данных...(то есть набор каких то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru