Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
AndreySeVeN
2 / 2 / 1
Регистрация: 06.06.2014
Сообщений: 156
Записей в блоге: 1
#1

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

05.10.2017, 18:28. Просмотров 119. Ответов 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++):

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

Кодирование Хаффмана - C++
Помогите написать программу для кодирования и декодирования строк вида &quot;a_!slf&quot; с помощью метода Хаффмана через частотный код. Может у...

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

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

Метод сжатия Хаффмана - C++
Есть Метод сжатия Хаффмана или нет и как его использовать ? покажите если можите ? ну те кто уже знает !

Оптимизация алгоритма Хаффмана - C++
Сделал архиватор, но работает он запредельно долго ~ 30 мин на папку размером 50Mb(и это только упаковка). нужна помощь &quot;Гуру&quot; что бы...

1
AndreySeVeN
2 / 2 / 1
Регистрация: 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
Привет! Вот еще темы с ответами:

Дерево Хаффмана - C++
Здравствуйте. Хотел узнать как работает дерево Хаффмана и 4 дня изучал материалы в интернете (статьи, видеоуроки) и т.д.), написал...

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

Двоичное дерево Хаффмана - C++
Дана некоторая последовательность данных...(то есть набор каких то значений)...этот набор представляет из себя набор конечных потомков...

Дерево Хаффмана. Класс недоступен - C#
Пытаюсь собрать дерево по Хаффману.сам пока не дорос до такого, поэтому нашел вот тут...


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

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

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