资源简介
利用二叉树结构实现赫夫曼编/解码器。
基本要求:
1、 初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立赫夫曼树
2、 建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出。
3、 编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。
4、 译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。
5、 打印(Print):以直观的方式打印赫夫曼树(选作)
6、 计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。
测试数据:
I love data Structure, I love Computer. I will try my best to
study data Structure.
代码片段和文件信息
/*(二)内容2
利用二叉树结构实现赫夫曼编/解码器。
基本要求:
1、 初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立赫夫曼树
2、 建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出。
3、 编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。
4、 译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。
5、 打印(Print):以直观的方式打印赫夫曼树(选作)
6、 计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。
测试数据:
I love data Structure I love Computer. I will try my best to
study data Structure.*/
// 实现赫夫曼编码,实现P147算法6.12的程序。
#include
#include
#include
#include
#define UINT_MAX 32677
// 赫夫曼树和赫夫曼编码的存储表示
typedef struct
{
char ch;
unsigned int weight;
unsigned int parentlchildrchild;
}HTNode*HuffmanTree; // 动态分配数组存储赫夫曼树
typedef char **HuffmanCode; // 动态分配数组存储赫夫曼编码表
// 函数void select()调用
int min1(HuffmanTree tint i)
{
int jflag;
unsigned int k=UINT_MAX; // 取k为不小于可能的值
for(j=1;j<=i;j++)
if(t[j].weight k=t[j].weightflag=j;
t[flag].parent=1;
return flag;
}
void select(HuffmanTree tint iint &s1int &s2)
{ // s1为最小的两个值中序号小的那个
int j;
s1=min1(ti);
s2=min1(ti);
if(s1>s2)
{
j=s1;
s1=s2;
s2=j;
}
}
// P147算法6.12的实现
void HuffmanCoding(HuffmanTree &HTHuffmanCode &HCint w[50]int nint jint a[50]char s[100])
{ // w存放n个字符的权值(均>0)构造赫夫曼树HT并求出n个字符的赫夫曼编码HC
int mis1s2;
HTNode *p;
if(n<=1) return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); // 0号单元未用
/*for(p=HT+1i=0;i<50;i++++p)
if(a[i]!=0)
{
(*p).ch=i+‘a‘;
}*/
for(p=HT+1i=1;i<=n;++i++p) // 给赫夫曼树的前n个结点赋初值
{
(*p).ch=s[i-1];
(*p).weight=w[i-1];
(*p).parent=0;
(*p).lchild=0;
(*p).rchild=0;
}
for(;i<=m;++i++p) // 给赫夫曼树的第n个结点后面的结点赋初值
{ //(*p).weight=‘?‘;
(*p).weight=0;
(*p).parent=0;
(*p).lchild=0;
(*p).rchild=0;
}
// 构建赫夫曼树
for(i=n+1;i<=m;++i)
{ // 在HT[1~i-1]中选择parent为0且weight最小的两个结点其序号分别为s1和s2
select(HTi-1s1s2);
HT[s1].parent=HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
// 从叶子到根逆向求每个字符的赫夫曼编码
int start;
unsigned cf;
char *cd;
HC=(HuffmanCode)malloc((n+1)*
- 上一篇:C#调用C++包括C++的opencv
- 下一篇:C语言课程设计——教室管理系统
评论
共有 条评论