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

Есть программа по кодированию и декодированию методом Хаффмана с помощью дерева, на я не совсем понимаю что здесь к чему! - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вывести все возможные комбинации цепочек в матрице смежности http://www.cyberforum.ru/cpp-beginners/thread722972.html
Есть матрица смежности вида: AB0 BCD DD0 CKN NE0 KB0 Т.е. если в конце строки 0, то из одного узла есть связь только к одному узлу, иначе - к двум. Задача: вывести все возможные комбинации...
C++ Помогу Всем привет!!! Язык программирования C++; Знания: немного STL; ООП; теория. Обращайтесь в ЛС!!! http://www.cyberforum.ru/cpp-beginners/thread722948.html
Проигрывание видео mp4, avi C++
Доброго. Проблема собственно с проигрыванием видеофайлов. Пытался использовать DirectShow - он воспроизводит авишники но в каком то своем окне и нигде не нашел как это лечить. Пытался понять...
C++ Какая-то неопределенность при наследовании
Всем привет! Прошу помощи. Суть: //A.h class A { A(); virtual ~A();
C++ Дерево и длина строки http://www.cyberforum.ru/cpp-beginners/thread722849.html
Есть пример дерева , где вычисляется наименьший его элемент. Помогите переписать код , чтобы найти самую короткую строку в дереве, элементы которого хранят какую-то строку. #include<iostream>...
C++ Алгоритм шифрования WAKE Пытаюсь реализовать алгоритм шифрования WAKE, нашел сайт, где функции вроде бы описаны, но не могу разобраться, как их применять, так же есть исходник, где видимо пытались реализовать алгоритм, но он... подробнее

Показать сообщение отдельно
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229

Есть программа по кодированию и декодированию методом Хаффмана с помощью дерева, на я не совсем понимаю что здесь к чему! - C++

07.12.2012, 17:21. Просмотров 326. Ответов 0
Метки (Все метки)

Здравствуйте! Есть программа по кодированию и декодированию методом Хаффмана с помощью дерева, на я не совсем понимаю что здесь к чему! Прокомментируйте кто-то программу, буду очень благодарен)
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
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#define line  "*********************************"
 
typedef struct node_t {
    struct node_t *left, *right;
    int freq;
    char c;
} *node;
 
struct node_t pool[256] = {{0}};
node qqq[255], *q = qqq - 1;
int n_nodes = 0, qend = 1;
char *code[128] = {0}, buf[1024];
 
node new_node(int freq, char c, node a, node b)
{
    node n = pool + n_nodes++;
    if (freq) n->c = c, n->freq = freq;
    else {
        n->left = a, n->right = b;
        n->freq = a->freq + b->freq;
    }
    return n;
}
 
void qinsert(node n)
{
    int j, i = qend++;
    while ((j = i / 2)) {
        if (q[j]->freq <= n->freq) break;
        q[i] = q[j], i = j;
    }
    q[i] = n;
}
 
node qremove()
{
    int i, l;
    node n = q[i = 1];
 
    if (qend < 2) return 0;
    qend--;
    while ((l = i * 2) < qend) {
        if (l + 1 < qend && q[l + 1]->freq < q[l]->freq) l++;
        q[i] = q[l], i = l;
    }
    q[i] = q[qend];
    return n;
}
 
void build_code(node n, char *s, int len)
{
    static char *out = buf;
    if (n->c) {
        s[len] = 0;
        strcpy(out, s);
        code[n->c] = out;
        out += len + 1;
        return;
    }
 
    s[len] = '0'; build_code(n->left,  s, len + 1);
    s[len] = '1'; build_code(n->right, s, len + 1);
}
 
void init(char *s)
{
    int i, freq[128] = {0};
    char c[16];
 
    while (*s) freq[(int)*s++]++;
 
    for (i = 0; i < 128; i++)
        if (freq[i]) qinsert(new_node(freq[i], i, 0, 0));
 
    while (qend > 2) 
        qinsert(new_node(0, 0, qremove(), qremove()));
 
    build_code(q[1], c, 0);
}
 
void encode(char *s, char *out)
{
    while (*s) {
        strcpy(out, code[*s]);
        out += strlen(code[*s++]);
    }
}
 
void decode(char *s, node t)
{
    node n = t;
    while (*s) {
        if (*s++ == '0') n = n->left;
        else n = n->right;
 
        if (n->c) putchar(n->c), n = t;
    }
 
    putchar('\n');
    if (t != n) cout<<"garbage input\n";
}
 
int main(void)
{
    int i;
    cout<<line<<"\n\tHuffman Coding\n"<<line<<"\n";
    cout<<"    Enter text for coding:\n";
    char str[100], buf[1024];
     gets(str);
    init(str);
    for (i = 0; i < 128; i++)
        if (code[i]) printf("'%c': %s\n", i, code[i]);
    encode(str, buf);
    cout<<"encoded:  "<<buf<<"\n";
    cout<<"decoded:  ";
    decode(buf, q[1]);
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru