• 大小: 5KB
    文件类型: .cpp
    金币: 2
    下载: 1 次
    发布日期: 2022-01-06
  • 语言: C/C++
  • 标签: 赫夫曼  

资源简介

利用二叉树结构实现赫夫曼编/解码器。 基本要求: 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)*

评论

共有 条评论