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

Хаффман с++ - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ В одномерном массиве состоящем из N вещественных элементов вычислить http://www.cyberforum.ru/cpp-beginners/thread534407.html
Здраствуйте. Пожалуйста сделайте эту же задачу то ко на С.Не на С++ а на C.
C++ В программе реализовать возможность записи объектов в файл и чтения объектов из файла Добрый день, помогите, пожалуйста! У меня есть программа: #include <iostream> #include <locale.h> using namespace std; class train { int number_id; char destination; int time; http://www.cyberforum.ru/cpp-beginners/thread534406.html
Перегрузка оператора * C++
Операция произведения применяется к объекту квадрат, при этом изменяются координаты центры фигуры. Результатом произведения является квадрат координаты центра которого равны произведению...
C++ Используя функции сформировать одномерный массив и отсортировать по возрастанию только те элементы массива, которые являются простыми числами
Помогите закончить две задачи. 1. Используя функции сформировать одномерный массив и отсортировать по возрастанию только те элементы массива, которые являются простыми числами(делятся на 1 и сами на...
C++ Редактирование бинарного файла http://www.cyberforum.ru/cpp-beginners/thread534334.html
возможно ли написать такую функцию которая будет редактировать бинарный файл?
C++ '...' was not declared in this scope Доброго времени суток. Столкнулся с одной проблемой при создании класса: имеется описание класса : class CDateTime { public: int year,mon,day,hour,min,sec,MDay; CDateTime(); ... подробнее

Показать сообщение отдельно
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200

Хаффман с++ - C++

30.03.2012, 10:30. Просмотров 5609. Ответов 10
Метки (Все метки)

Здравстуйте.
Это код хаффмана.
У меня вопрос, я не понял часть int main ()
Расскажите подробнее что там происходит.

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
 
struct s_node
{
    int c;
    char ch;
    int n;
    std::vector<s_node*> br;
};
 
class my_ifstream: public std::ifstream
{
public:
    virtual my_ifstream& operator>>( char&);
    my_ifstream(const char *_Filename, std::ios_base::openmode _Mode = ios_base::in, int _Prot = (int)ios_base::_Openprot);
};
 
my_ifstream::my_ifstream(const char *_Filename, std::ios_base::openmode _Mode, int _Prot):std::ifstream(_Filename, _Mode, _Prot)
{
}
 
my_ifstream& my_ifstream::operator>>( char& ch)
{
    ch = get();
 
    return *this;
}
 
void tree_walk(s_node *);
void tree_del(s_node *);
void write_message();
 
std::ofstream fout("output.txt");
std::string table[256];
 
int main()
{
    my_ifstream fin("input.txt", std::ios_base::in | std::ios_base::binary);
    
    if (!fin.is_open())
    {
        std::cout << "Input file not found" << std::endl;
        
        system("pause");
 
        return 0;
    }
 
    std::vector< char> ch_set;
    std::vector<s_node> nodes;
    char ch;
    int j = 0;
 
    while (fin >> ch)
    {
        int i;
 
        for (i = 0; i < ch_set.size() && ch_set[i] != ch; i++);
 
        if (i == ch_set.size())
        {
            s_node t;
 
            ch_set.push_back(ch);
 
            t.ch = ch;
            t.n = 0;
            t.c = 0;
        
            nodes.push_back(t);
 
            my_ifstream fin2("input.txt", std::ios_base::in | std::ios_base::binary);
 
            while (fin2 >> ch)
                if (ch == nodes[j].ch)
                    nodes[j].n++;
 
            j++;
        }
    }
 
    for (int i = 0; i < nodes.size() - 1; i++)
        fout << "'" << nodes[i].ch << "'" << nodes[i].n << ", ";
    
    fout << "'" << nodes[nodes.size() - 1].ch << "'" << nodes[nodes.size() - 1].n << std::endl << std::endl;
 
    std::vector<s_node*> t;
 
    for (int i = 0; i < nodes.size(); i++)
    {
        t.push_back(new s_node);
        *t[i] = nodes[i];
    }
 
    while (t.size() > 1)
    {
        s_node *x;
 
        for (int i = 0; i < t.size(); i++)
            for (int j = 0; j < t.size(); j++)
                if (t[i]->n < t[j]->n)
                    x = t[i], t[i] = t[j], t[j] = x;
 
        s_node *min1 = t[0];
        int c1 = 0;
 
        t.erase(t.begin() + c1);
        
        s_node *min2 = t[0];
        int c2 = 0;
 
        s_node *tmp = new s_node;
 
        tmp->br.push_back(min1);
        tmp->br.push_back(min2);
 
        tmp->c = 2;
        tmp->n = min1->n + min2->n;
        t[c2] = tmp;
    }
 
    tree_walk(t[0]);
    write_message();
    tree_del(t[0]);
 
    return 0;
}
 
void tree_walk(s_node *root)
{
    static std::string s = "";
 
    if (root->c)
    {
        s += "1";
        
        tree_walk(root->br[1]);
        s.erase(s.size() - 1, 1);
        
        s +="0";
 
        tree_walk(root->br[0]);
        s.erase(s.size() - 1, 1);
    }
    else
    {
        fout << "'" << root->ch << "'" << " = " << s << std::endl;
        table[root->ch] = s;
    }
}
 
void tree_del(s_node *root)
{
    if (root->c)
    {
        tree_del(root->br[1]);
        tree_del(root->br[0]);
    }
    else
        delete root;
}
 
void write_message()
{
    my_ifstream fin("input.txt");
    char ch;
 
    fout << std::endl;
 
    while(fin >> ch)
        fout << table[ch];
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru