From ddfe40aa8a32a256094275b1a6b6ba5074101409 Mon Sep 17 00:00:00 2001 From: Yevhen Kozirovskyi Date: Tue, 28 Jan 2025 19:08:59 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20sk1/compressor.c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sk1/compressor.c | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/sk1/compressor.c b/sk1/compressor.c index 8c3f617..7527c0a 100644 --- a/sk1/compressor.c +++ b/sk1/compressor.c @@ -24,7 +24,6 @@ typedef struct LZ77{ char dalsi_znak; } LZ77; -// Функция для создания нового узла Node* create_node(int symbol, unsigned int frequency) { Node* node = (Node*)malloc(sizeof(Node)); node->symbol = symbol; @@ -33,19 +32,16 @@ Node* create_node(int symbol, unsigned int frequency) { return node; } -// Функция для построения дерева Хаффмана Node* build_huffman_tree(const unsigned int* frequencies) { Node* nodes[MAX_SYMBOLS]; int node_count = 0; - // Создаем узлы для всех символов с ненулевой частотой for (int i = 0; i < MAX_SYMBOLS; i++) { if (frequencies[i] > 0) { nodes[node_count++] = create_node(i, frequencies[i]); } } - // Объединяем узлы в дерево while (node_count > 1) { // Сортируем узлы по частоте for (int i = 0; i < node_count - 1; i++) { @@ -56,7 +52,6 @@ Node* build_huffman_tree(const unsigned int* frequencies) { } } - // Объединяем два узла с наименьшей частотой Node* left = nodes[0]; Node* right = nodes[1]; Node* parent = create_node(-1, left->frequency + right->frequency); @@ -71,24 +66,22 @@ Node* build_huffman_tree(const unsigned int* frequencies) { return nodes[0]; } -// Рекурсивная функция для генерации кодов Хаффмана void generate_huffman_codes(Node* root, char* code, int depth, char codes[MAX_SYMBOLS][MAX_SYMBOLS]) { if (!root->left && !root->right) { - code[depth] = '\0'; // Завершаем код символа + code[depth] = '\0'; strcpy(codes[root->symbol], code); return; } if (root->left) { - code[depth] = '0'; // Добавляем бит '0' для левого поддерева + code[depth] = '0'; generate_huffman_codes(root->left, code, depth + 1, codes); } if (root->right) { - code[depth] = '1'; // Добавляем бит '1' для правого поддерева + code[depth] = '1'; generate_huffman_codes(root->right, code, depth + 1, codes); } } -// Функция для освобождения памяти, выделенной под дерево Хаффмана void free_huffman_tree(Node* root) { if (!root) return; free_huffman_tree(root->left); @@ -96,7 +89,6 @@ void free_huffman_tree(Node* root) { free(root); } -// Функция сжатия данных с использованием алгоритма Хаффмана int compress_1(const char* input_file, const char* output_file) { FILE* input = fopen(input_file, "rb"); FILE* output = fopen(output_file, "wb"); @@ -122,10 +114,9 @@ int compress_1(const char* input_file, const char* output_file) { char code[MAX_SYMBOLS] = {0}; generate_huffman_codes(root, code, 0, codes); - // Записываем частоты в выходной файл + fwrite(frequencies, sizeof(frequencies[0]), MAX_SYMBOLS, output); - // Сжимаем данные rewind(input); unsigned char current_byte = 0; int bit_count = 0; @@ -145,7 +136,6 @@ int compress_1(const char* input_file, const char* output_file) { } } - // Записываем маркер EOF char* eof_code = codes[256]; for (size_t j = 0; eof_code[j] != '\0'; j++) { current_byte = (current_byte << 1) | (eof_code[j] - '0'); @@ -167,7 +157,6 @@ int compress_1(const char* input_file, const char* output_file) { return 0; } -// Функция декомпрессии данных с использованием алгоритма Хаффмана int decompress_1(const char* input_file, const char* output_file) { FILE* input = fopen(input_file, "rb"); FILE* output = fopen(output_file, "wb"); @@ -182,7 +171,7 @@ int decompress_1(const char* input_file, const char* output_file) { unsigned char byte; int bit; - // Читаем и декодируем символы + while (fread(&byte, 1, 1, input) == 1) { for (bit = 7; bit >= 0; bit--) { current = (byte & (1 << bit)) ? current->right : current->left;