教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 外语考试 >

文本文件压缩.cpp

来源:网络收集 时间:2026-08-25
导读: 文本文件压缩,huffman编码 #includecmath #includestdlib.h #includestring #includeiostream #includeconio.h #define CC system( CLS) #define FF fflush(stdin) #define MAX 255 #define BIT 7 #define MAX_CODE_LEN 65536 #define ENT coutendl #define

文本文件压缩,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字,全部文档内容请下载后查看。喜欢就下载吧 ……

文本文件压缩.cpp.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1694242.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)