这是本人在本科阶段的哈弗曼树的代码实现。设计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++;