文本文件压缩.cpp
文本文件压缩,huffman编码
#include<cmath>
#include<stdlib.h>
#include<string>
#include<iostream>
#include<conio.h>
#define CC system(" CLS")
#define FF fflush(stdin)
#define MAX 255
#define BIT 7
#define MAX_CODE_LEN 65536
#define ENT cout<<endl
#define SPACE cout<<"\t\t\t\t"
using namespace std;
typedef struct{
int weight;
int parent;
int lchild;
int rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
typedef struct {
char ch;
//HuffmanCode HC;
int n;
}node,*pnode;
void welcome(){
int i,j;int n=65;
system("color ce");
cout<<endl<<"\t\t\t\t欢迎使用"<<endl<<endl;
for(i=0;i<80;i++)cout<<"*";
cout<<endl;
for(i=0;i<15;i++){putchar('\t');
for(j=0;j<=n;j++){
if(i%2){
if(j%3==0)putchar(0X20);
if(j%3==1)putchar(0X2);
if(j%3==2)putchar(0X1);}
else{
if(j%3==0)putchar(0X20);
if(j%3==1)putchar(0X1);
if(j%3==2)putchar(0X2);}}
cout<<endl;}
system("pause & cls");}
void top(){
SPACE;cout<<"文本文件压缩"<<endl;
for(int i=0;i<8;i++)cout<<' ';
for(i=0;i<65;i++)cout<<"*";
cout<<endl;}
void main_menu(){top();
SPACE;cout<<"1.输入文本"<<endl<<endl;
SPACE;cout<<"2.创建编码"<<endl<<endl;
SPACE;cout<<"3.压缩文本"<<endl<<endl;
SPACE;cout<<"4.解压文本"<<endl<<endl;}
int input(pnode &point,string &str){
FILE*fp;
int i=0,j,n,h,k=0;char c;char*nn;
char*fname=new char[125];
cout<<"请输入要存放字符的文件名:"<<endl;
cin>>fname;
nn=strstr(fname,".");
if(!nn)strcat(fname,".txt");
else {if(strncmp(nn,".txt",4))strcat(fname,".txt");}
fp=fopen(fname,"w");
FF;
cout<<"请输入要压缩的字符:"<<endl;
//getline(cin,str);
//cin>>str;
c=cin.get();
while(c!='\n'){fputc(c,fp);str+=c;c=cin.get ();}
fflush(fp);fclose(fp);
n=str.length();
cout<<"字符串总共有字符"<<n<<"个"<<endl;
for(i=0;i<n;i++)
{
j=0;h=0;
while(str[i]!=str[j])j++;
if(j==i)
{
point[k].ch=str[i];
cout<<"\t\t字符"<<point[k].ch<<"出现";
}
else continue;
for(j=i;j<n;j++)if(str[i]==str[j])h++;
cout<<h<<"次"<<endl;
point[k].n =h;
k++;
}
return k;
}
void PT(HuffmanTree HT,int n,pnode point){
cout<<"huffman树为:"<<endl;
printf("\t\tNO.\tchar\tascii\tweight\tparent\tlchild\trchild\n");
for(int i=1;i<=n;i++)printf("\t\t%d\t%c\t%d\t%d\t%d\t%d\t%d\n",i,point[i-1].ch,point[i-1].ch,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
for(;i<=2*n-1;i++)printf("\t\t%d\t%c\t%c\t%d\t%d\t%d\t%d\n",i,'-','-',HT[i].weight ,HT[i].parent ,HT[i].lchild ,HT[i].rchild );}
void PC(HuffmanCode HC,int n,pnode point){
int i=0;
cout<<"\t\tchar\tascii\tcode"<<endl;
for(i=1;i<=n;i++){printf("\t\t%c\t%d\t",point[i-1].ch,point[i-1].ch );
cout<<HC[i]&l
t;<endl;}
}
void Select(HuffmanTree HT,int n,int &s1,int &s2){
for(int i=1;i<=n;i++)
if(!HT[i].parent){s1=i; break;}
文本文件压缩,huffman编码
for(i++;i<=n;i++)
if(!HT[i].parent){s2=i; break;}
if(HT[s1].weight-HT[s2].weight){
int temp; temp=s1; s1=s2; s2=temp;
}
for(i=1;i<=n;i++)
if(!HT[i].parent){
if(HT[i].weight<HT[s1].weight){s2=s1; s1=i;}
else if(HT[i].weight<HT[s2].weight&&i!=s1) s2=i;}
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,pnode point,int n){
int i,s1,s2;
pnode point0=point;
if(n<1)return ;
HuffmanTree p;
int m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1;i<=n;i++,p++,point++){p->weight=point->n;p->parent=0;p->lchild=0;p->rchild=0;}
for(;i<=m;i++,p++){p->weight=0;p->parent=0;p->lchild=0;p->rchild=0;}
for(i=n+1;i<=m;i++){
Select(HT,i-1,s1,s2);
HT[s1].parent=i;HT[s2].parent=i;
HT[i].lchild=s1;HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
char*cd=(char*)malloc(n*sizeof(char));
if(!cd)return;
cd[n-1]='\0';
for(i=1;i<=n;i++){
int c,f;int start=n-1;
for(c=i,f=HT[c].parent;f;c=f,f=HT[f].parent){
if(HT[f].lchild==c)cd[--start]='0';
else cd[--start]='1';}
HC[i]=(char*)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
}
free(cd);
}
void TOHC(string str,HuffmanCode HC,pnode point,char*&code){
int i;
code=new char[MAX_CODE_LEN];
memset(code,0,MAX_CODE_LEN);
for(i=0;i<str.length();i++){
int j=0;while(str[i]!=point[j++].ch );strcat(code,HC[j]);cout<<HC[j];}
}
void TOCHAR(HuffmanCode HC,pnode point,char*code,char*&str,int n){
int i=0,j,k,l=0;int max,min;int total=0;
max=min=strlen(HC[1]);
for(j=1;j<=n;j++){total+=point[j-1].n;
if(max<strlen(HC[j])) max=strlen(HC[j]);
if(min>strlen(HC[j]))min=strlen(HC[j]);}
str=new char[total];
memset(str,0,total);
for(i=0;i<strlen
…… 此处隐藏:6068字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [外语考试]管理学 第13章 沟通
- [外语考试]07、中高端客户销售流程--分类、筛选讲
- [外语考试]2015-2020年中国高筋饺子粉市场发展现
- [外语考试]“十三五”重点项目-汽车燃油表生产建
- [外语考试]雅培奶粉培乐系列适用年龄及特点
- [外语考试]九三学社入社申请人调查问卷
- [外语考试]等级薪酬体系职等职级表
- [外语考试]货物买卖合同纠纷起诉状(范本一)
- [外语考试]青海省实施消防法办法
- [外语考试]公交车语音自动报站系统的设计第3稿11
- [外语考试]logistic回归模型在ROC分析中的应用
- [外语考试]2017-2021年中国隔膜泵行业发展研究与
- [外语考试]神经内科下半年专科考试及答案
- [外语考试]园林景观设计规范标准
- [外语考试]2018八年级语文下册第一单元4合欢树习
- [外语考试]分布式发电及微网运行控制技术应用
- [外语考试]三人行历史学笔记:中世纪人文主义思想
- [外语考试]2010届高考复习5年高考3年联考精品历史
- [外语考试]挖掘机驾驶员安全生产责任书
- [外语考试]某211高校MBA硕士毕业论文开题报告(范
- 用三层交换机实现大中型企业VLAN方案
- 斯格配套系种猪饲养管理
- 涂层测厚仪厂家直销
- 研究生学校排行榜
- 鄱阳湖湿地景观格局变化及其驱动力分析
- 医学基础知识试题库
- 2010山西省高考历年语文试卷精选考试技
- 脉冲宽度法测量电容
- 谈高职院校ESP教师的角色调整问题
- 低压配电网电力线载波通信相关技术研究
- 余额宝和城市商业银行的转型研究
- 篮球行进间运球教案
- 气候突变的定义和检测方法
- 财经大学基坑开挖应急预案
- 高大支模架培训演示
- 一种改进的稳健自适应波束形成算法
- 2-3-鼎视通核心人员薪酬股权激励管理手
- 我国电阻焊设备和工艺的应用现状与发展
- MTK手机基本功能覆盖测试案例
- 七年级地理教学课件上册第四章第一节




