C++ 实现Huffman编译码器

实现功能

1.实现自动统计输入文本的字符个数以及各字符的权值;
2.实现输入字符及各权值进行Huffman编码;
3.实现从文档保存数据及读取数据;
4.各字符及其权值是由单链表的形式存储的;
5.译码是每50个01字符输出换行;
**注**Huffman树的建立是通过课本方法建立,其方式就不多说了。

代码实现

huffman.cpp

#include "huffman3.h"

void Huffman :: readtext(char *file)
{           //读取文件中的数据,包括空格
    indata.open(file);
    if (! indata)
    {
        cout << "ERROR!" << endl;
    }
    char temp[100];
    indata.getline(temp, 100);
    text += temp;
}

void Huffman :: savetext(char *file)
{                      //保存数据到文件
    outdata.open(file);
    if (! outdata)
    {
        cout << "ERROR" << endl;
    }
    outdata << text;
}

void Huffman :: readcode(char *file)
{                          //读取代码
    indata.open(file);
    indata >> huffmancode; 
}

/*void Huffman::ReadCodeFromFile(char *filename)
{                          //读取代码(这个也可以用)
    ifstream infile(filename);
    if (!infile)
    {
        cerr << "无法打开文件!" << endl;
        return;
    }
    infile >> huffmancode;
    cout << huffmancode << endl;
}*/

void Huffman :: savecode(char *file)
{
    outdata.open(file);
    if (!outdata)
    {
        cout << "ERROR" << endl;
    }
    outdata << huffmancode;
}

void Huffman::HuffmanCoding()
{   //huffman树的建立
    if (number <= 1)
        return;
    int m = 2 * number - 1;     //哈弗曼树所需节点数
    huffmantree = new HTNode[m + 1];        //0号单元未使用
    huffmancharslist p;
    p = l -> next;
    int i;
    for (i = 1; i <= number; ++i)//初始化
    {
        huffmantree[i].weight = p -> weight;
        huffmantree[i].parent = 0;
        huffmantree[i].lchild = 0;
        huffmantree[i].rchild = 0;
        p = p -> next;
    }
    for (i = number + 1; i <= m; ++i)
    {
        huffmantree[i].weight = 0;
        huffmantree[i].parent = 0;
        huffmantree[i].lchild = 0;
        huffmantree[i].rchild = 0;
    }
    for (i = number + 1; i <= m; ++i)//建哈弗曼树
    {
        int s1, s2;
        select(i - 1, s1,
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值