#include <STDIO.H>
#include <stdlib.h>
#include <string.h>
typedef unsigned int unint;
#define MAX 1000;
typedef struct
{
unint weight;
unint parent, lchild, rchild;
}HTNode, *HuffmanTree;
typedef char ** HuffmanCode;
void Select(HuffmanTree &HT, unint n, unint &s1num, unint &s2num)
{
unint tempMin, tempNum;
unint i;
unint s1, s2;
s1 = s2 = MAX;
for(i = 1; i <= n; i++)
if( (0 == HT[i].parent) && (HT[i].weight < s2) )
{
s2 = HT[i].weight;
s2num = i;
if(s2 < s1)
{
tempMin = s2;
s2 = s1;
s1 = tempMin;
tempNum = s2num;
s2num = s1num;
s1num = tempNum;
}
}
if (0 == HT[s2num].lchild)
{
tempNum = s2num;
s2num = s1num;
s1num = tempNum;
}
}
void HuffmanCoding( HuffmanTree &HT, HuffmanCode &HC, unint *w, unint n )
{ // w存放n个字符的权值(均>0),构造Huffman树HT,并求出n个字符的Huffman编码HC。
unint m, i, start, c, s2, s1, f;
HuffmanTree p;
char *cd;
if (n <= 1) return;
m = 2 * n - 1;
HT = (HuffmanTree) malloc ( (m + 1) * sizeof(HTNode) );// 0号单元未用
for (p = HT + 1, i = 1; i <= n; ++i, ++p, ++w)
{
// *p = { *w, 0, 0, 0 };
p->weight = *w;
p->parent = 0;
p->lchild = 0;
p->rchild = 0;
}
for (; i <= m; ++i, ++p)
{
//*p = { 0, 0, 0, 0};
p->weight = 0;
p->parent = 0;
p->lchild = 0;
p->rchild = 0;
}
for (i = n+1; i <= m; ++i)// 建Huffman树
{
Select(HT, i - 1, s1, s2);
// 在HT[1..i-1]选择parent为0且weight最小的两个结点,其序号分别为s1和s2。
HT[s1].parent = i;
HT[s2].parent = i;
HT[i].lchild = s1;
HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
//----从叶子到根逆向求每个字符的Huffman编码------------
HC = (HuffmanCode) malloc ( (n + 1) * sizeof(char *) );// 分配n个字符编码的头指针向量
cd = (char *) malloc (n * sizeof(char));// 分配求编码的工作空间
cd[n - 1] = '\0'; // 编码结束符
for (i = 1; i <= n; ++i) // 逐个字符求Huffman编码
{
start = n - 1;
for (c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)// 从叶子到根逆向求编码
if (c == HT[f].lchild)
cd[-- start] = '0';
else
cd[-- start] = '1';
HC[i] = (char *) malloc ( (n - start) * sizeof(char) );// 为第i个字符编码分配空间
strcpy(HC[i], &cd[start]); // 从cd复制编码(串)到HC
printf("%s\n",HC[i]);
free(HC[i]);
}
free(HT);// 释放工作空间
free(cd);
free(HC);
}
int main()
{
HuffmanTree HT;
HuffmanCode HC;
unint w[8]={5, 29, 7, 8, 14, 23, 3, 11};
unint n = 8;
HuffmanCoding(HT, HC, w, n);
return 0;
}
不清楚有木有错~
求大牛带
分享到:
相关推荐
通过阅读和理解这些代码,可以加深对Huffman编码和数据结构的理解,并能够动手实现一个简单的数据压缩工具。 总之,Huffman编码是数据压缩领域的一个经典案例,它利用了数据的统计特性,实现了高效的数据压缩。...
此外,对于动态变化的数据流,Huffman编码的效率会降低,因为它需要不断更新树结构。 总结来说,“Huffman树及Huffman编码演示程序”是一个教育工具,可以帮助用户通过图形化界面理解Huffman编码的工作原理,从而...
哈夫曼树(Huffman Tree),也称为最优二叉树,是数据压缩中常用的一种数据结构。它是一种带权路径长度最短的二叉树,由哈夫曼在1952年提出,用于解决“最小带权路径长度”问题。在哈夫曼树中,频率较高的字符对应的...
数据结构: #define n 100 //叶子结点数 #define m 2*n-1 // Huffman树中结点总数 typedef struct { int weight; //权值 int lchild , rchild , parent; //左右孩子及双亲指针 }HTNode; //树中结点类型 typedef ...
它是基于二叉树的数据结构,主要用于创建一种特殊的前缀编码(也称为前缀码或无歧义编码),其中每个字符的编码都不会是其他字符编码的前缀,避免了解码过程中的歧义。 在Huffman编码的过程中,首先需要构建一个...
Huffman树,又称最优二叉树...总的来说,这个实验旨在让你深入理解Huffman编码和树的构建过程,并通过实际操作体验其在数据压缩中的应用。通过编写和调试代码,你不仅能巩固数据结构知识,还能提高问题解决和编程能力。
在本课程设计的项目中,提供的"06082130"文件可能包含了C++源代码实现以上步骤,以及可能有的测试文件和报告,用于展示Huffman编码和解码的完整流程和性能分析。通过这个项目,学生可以深入理解Huffman编码的工作...
数据结构中的Huffman树,又称为最优二叉树或赫夫曼树,是根据赫夫曼编码(Huffman Coding)理论构建的一种特殊的二叉树。它在计算机科学中有着广泛的应用,特别是在数据压缩领域,例如在文件压缩软件中。本文将深入...
在本例中,"asan_huffman_OK.rar"可能包含了一个实现哈夫曼编码和译码的程序,而"李若谷_数据结构_huffman.doc"可能是关于哈夫曼编码的详细设计文档,包括算法的描述、步骤以及可能的设计决策。 哈夫曼编码的优化和...
Huffman编码是一种高效的数据压缩方法,它基于字符出现频率构建一棵特殊的二叉树——Huffman树,以此来为每个字符分配唯一的二进制编码。在信息传输或存储时,使用这种编码可以显著减少数据量,因为频繁出现的字符...
在编码和解码过程中,代码利用栈的思想(尽管【描述】中提到采用栈,但实际操作中并未明确使用栈),通过递归函数的调用来遍历树结构,生成和还原编码。 综上所述,霍夫曼树编码解码的核心概念和实现过程涉及到了...
本实验报告中,"【实验三】Huffman树及Huffman编码的算法实现"可能包含了详细的代码实现,展示了如何使用编程语言(如C++、Java或Python)来实现上述步骤。实验可能会包括测试不同频率分布的字符集,以及对比不同...
关于Huffman树的编码问题,适合基础薄弱的学生转载
Huffman编码是一种高效的数据压缩算法,它基于一种称为Huffman树(或Huffman编码树)的数据结构。在MATLAB环境中实现Huffman编码树,可以让我们更深入地理解该算法的工作原理,并能应用于实际的文件压缩。 首先,...
- `main.c`:主程序,调用Huffman编码和解码的函数,处理输入输出文件。 - `test.txt`:测试数据文件,用于演示编码和解码过程。 - `encoded.bin`:编码后的二进制文件。 - `decoded.txt`:解码后的文本文件。 通过...
在主函数`main`中,用户输入字符和权值,然后调用这两个函数进行编码和树的构建。程序最后输出生成的Huffman编码以及Huffman树的结构。 总结来说,Huffman编码是一种高效的数据压缩算法,通过构建特定的二叉树来...
4. 提供编码和解码功能,将原始文本转化为Huffman编码,或将Huffman编码还原为原始文本。 在给定的程序源代码中,`main`函数首先读取用户输入的字符及其频率,然后构建Huffman树,并利用树结构生成编码。然而,这段...