设计hafuman 编码器与解码器 C++实现

本文介绍了使用C++实现哈弗曼编码器和解码器的过程,旨在提高信道利用率和降低传输成本。通过统计字符频率构建哈弗曼树,并对字符文件进行编码和解码,生成二进制编码文件。适用于英文字符文件,期待读者的反馈和建议。
摘要由CSDN通过智能技术生成

这是本人在本科阶段的哈弗曼树的代码实现。设计hafuman 编码器与解码器

问题描述:利用哈夫曼编码进行信息通讯可以大大提高信道的利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传输数据预先编码;在接受端将传来的数据进行译码。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站编写一个哈夫曼码的编/译码系统。

基本要求:根据某字符文件统计字符出现频度,构造Huffman 树,编制Huffman编码,并将给定字符文件编码,生成编码文件;再将给定编码文件解码,生成字符文件。(要求按二进制位表示编码)英文文件。用二进制表示编码,生成二进制的编码文件。

 

 

#pragma once
#ifndef HUFFMAN_H
#define HUFFMAN_H
#include <iostream>
#include <string>
using namespace std;
//................  .h文件............
class node // 存放字符和字符频率类
{
public:
       intsign;
       charch;
       intfrequence;
       node():frequence(0),sign(0){}
       node(charx,int f=0){ch=x;frequence=f;}
       node&operator =(const node& n){ch=n.ch;frequence=n.frequence;return *this;}
};
 
 
 
//--------------------------------------------------以下是编码类-------------------------------------
 
class hufftree;
 
class huffnode
{friend class hufftree;
public:
       huffnode*next,*leftchild,*rightchild,*parent;
       intcode[100]; //.......存放编码....................//
       intdata; //..............权值.......................//
       charch; //字符//
       huffnode(huffnode*pnext=NULL,huffnode*left=NULL,huffnode*right=NULL)
       {next=pnext;leftchild=left;rightchild=right;
       }//..........数据成员初始花..........//
 
 
       huffnode(intitem,char a,huffnode *pnext=NULL,huffnode*left=NULL,huffnode*right=NULL)
       {data=item;ch=a;next=pnext;leftchild=left;rightchild=right;}
};
 
 
class hufftree
{
 
public:
       nodearray[100]; //.........存放单一字符对象数组.......................//
       huffnode*head,*huffroot;
       hufftree();
       voidInsert(int x,char a); //................插入...................//
       voidconnect(huffnode *p); //.....将接点链成单链表........//
       huffnode* Min();///......................求频率最小的那个接点
       voidFrequence(char line[]); 求每个字符的频率
       voidSethufftree();//..................造树problem.......................
       voidInorder(huffnode *r);//?????????
       voidoutput();//-------------------------------------输出函数---
       voiddelet(huffnode * p); //...........................断开指针,没有删除----------
       voidhuffcode(); // 构造huffman编码
       voidoutputcode();//-----------------------------------------------输出编码-----------
       voidsortcode(); //............输出编码信息
       voidIncode(char cha[]); //信息封装//
       voidtranscode(); // 进行译码
 
};
#endif
 
 
 
///
 
//#include "stdafx.h"
#include "huffman.h"
#include <iostream>
#include <fstream>
using namespace std;
extern int number;//..........输入字符长度................//
extern int a[100]; //....存放输入字符文件编码数组......//
extern int maxsize;//........输入字符文件编码长度.............//
int count; // 用来记录单一字符的长度
 
int len(char ch[])// 用来求字符串的长度
{
       inti(0),num(0);
       while(ch[i]!=NULL)
       {
              num++;
              i++;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值