设计一个哈夫曼编码、译码系统。对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件;反过来,可将编码文件译码还原为一个文本文件。
(1) 从文件中读入任意一篇英文短文(文件为ASCII编码,扩展名为txt);
(2) 统计并输出不同字符在文章中出现的频率(空格、换行、标点等也按字符处理);
(3) 根据字符频率构造哈夫曼树,并给出每个字符的哈夫曼编码;
(4) 图形化输出哈夫曼树、哈夫曼编码;
(5) 将文本文件利用哈夫曼树进行编码,存储成压缩文件(编码文件后缀名.huf)
(6) 用哈夫曼编码来存储文件,并和输入文本文件大小进行比较,计算文件压缩率;
(7) 进行译码,将huf文件译码为ASCII编码的txt文件,与原txt文件进行比较。
[测试数据]文本文件自行选择,至少含3000个字符。
[实现代码]
#include<iostream>
#include<fstream>
#include<queue>
#include<math.h>
using namespace std;
struct Node{
public:
Node *right;
Node *left;
char data;
int weight;
int x[100];
};
void InsertionSort(Node*A[],int n){
for(int i=1;i<n;i++){
Node *get=A[i];
int j=i-1;
while(j>=0&&A[j]->weight>get->weight){
A[j+1]=A[j];
j--;
}
A[j+1]=get;
}
}
Node* father(Node*root,Node*son){
Node*temp;
if(root==NULL||son==NULL)
return NULL;
if(root->left==son||root->right==son)
return root;
temp=father(root->left,son);
if(temp!=NULL)
return temp;
else
return father(root->right,son);
}
void preorder(Node*root){
if(root!=NULL) {
cout<<root->weight<<" ";
preorder(root->left);
preorder(root->right);
}
}
void sumlevel(Node*root,int *count,int l){
if(root!=NULL) {
count[l]=count[l]+1;
sumlevel(root->left,count,l+1);
sumlevel(root->right,count,l+1);
}
}
void levelorder(Node*t,int*count){
queue<Node*>q;
int x=0,i=0;
if(t!=NULL){
Node*p;
for(int z=0;z<60;z++){
cout<<" ";
}
cout<<t->data<<