资源简介
基于哈夫曼编码的文本文件压缩与解压缩,使用c语言,实际只是编码解码,不应该称为解压缩,因为编码后文件会更大
代码片段和文件信息
#include
#include
#include
#include
#include
#include
using namespace std;
typedef struct
{
int weight;
int parentlchildrchild;
}HTNode*HuffmanTree;
typedef struct
{
char* data;
int* num;
int length;
}TNode;
typedef struct
{
char *data;
char** HM;
}Code;
typedef char** HuffmanCode;
bool IfEncode()
{
int choose;
cout<<“\t 1.加密压缩 2.无密压缩“< cout<<“请输入选择:“;
cin>>choose;
if(choose==1)
return true;
else
return false;
}
void Encode(vector& v)
{
char ch[30];
v.push_back(‘@‘);
cout<<“请输入压缩密码“< cin>>ch;
for(int i=0;ch[i]!=‘\0‘;i++)
v.push_back(ch[i]);
v.push_back(‘\0‘);
v.push_back(‘@‘);
cout<<“开始压缩!“< }
void ReadTxt(vector& v)
{
char ch;
ifstream infile(“test.txt“ios::in);
if(!infile)
{
cerr<<“open error“< exit(1);
}
if(IfEncode())
Encode(v);
while(infile.peek()!=EOF)
{
infile.get(ch);
v.push_back(ch);
}
infile.close();
}
void InitList(TNode& T)
{
T.data=new char[256];
T.num=new int[256];
if(!T.data||!T.num)
exit(1);
T.length=0;
}
bool Find(TNode Tchar ch)
{
int i;
for(i=0;i if(ch==T.data[i])
return true;
return false;
}
void TCount(vector v1TNode &T)
{
int ij=0;
char ch;
int m=v1.size();
for(i=0;i {
ch=v1[i];
if(!Find(Tch))
{
T.data[j]=ch;
T.num[j]=count(v1.begin()v1.end()ch);
j++;
T.length++;
}
}
}
void Select(HuffmanTree &HTint mint& s1int& s2)
{
int kjnmin=32767;
for(k=1;k<=m;k++)
{
if(HT[k].parent==0)
if(HT[k].weight<=min)
{
j=k;
min=HT[k].weight;
}
}
s1=j;
HT[j].parent=1;
min=32767;
for(k=1;k<=m;k++)
{
if(HT[k].parent==0)
if(HT[k].weight<=min)
{
n=k;
min=HT[k].weight;
}
}
s2=n;
}
void CreateHuffmanTree (HuffmanTree &HTTNode Tint length)
{
int mis1s2;
if(length<=1)
return;
m=2*length-1;
HT=new HTNode[m+1];
for(i=1;i<=m;++i)
{
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(i=1;i<=length;++i)
HT[i].weight=T.num[i-1];
for(i=length+1;i<=m;i++)
{
Select(HTi-1s1s2);
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;
}
}
void CreatHuffmanCode (HuffmanTree HTHuffmanCode &HCint n)
{
int ifcstart;
HC=new char*[n+1];
char* cd=new char[n];
cd[n-1]=‘\0‘;
for(i=1;i<=n;i++)
{
start=n-1;
c=i;
f=HT[i].parent;
while(f!=0)
{
--start;
if(HT[f].lchild==c)
cd[start]=‘0‘;
else
cd[start]=‘1‘;
c=f;
f=HT[f].parent;
}
HC[i]=new char[n-start];
strcpy(HC[i]&cd[start]);
}
delete cd;
}
void Zip(HuffmanCode HCvector vTNode T)
{
int i=0j=0k=0;
ofstream outfile(“zip.txt“ios::out);
if(!outfile)
{
cerr<<“open error“<
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 928 2016-07-07 23:38 code.dat
文件 10279 2017-10-30 11:56 HuffMan.cpp
文件 634 2016-07-07 23:38 rzip.txt
文件 1662 2016-07-07 23:39 test.txt
文件 3714 2016-07-07 23:38 zip.txt
- 上一篇:C语言酒店管理系统 C语言大作业
- 下一篇:诊所信息管理系统C++课程设计报告
评论
共有 条评论