C++实现哈夫曼编码/译码器(数据结构)

该博客介绍了一个使用C++设计的哈夫曼编码和译码系统,该系统能对ASCII文本文件进行哈夫曼编码,生成编码文件,然后通过哈夫曼编码进行译码还原。步骤包括读取ASCII文本,统计字符频率,构建哈夫曼树,输出编码,图形化展示,文件编码压缩,计算压缩率,以及译码回原始文本文件。测试要求文本文件至少包含3000个字符。
摘要由CSDN通过智能技术生成

设计一个哈夫曼编码、译码系统。对一个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<<
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值