• 大小: 6KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-12
  • 语言: C/C++
  • 标签:

资源简介

基于哈夫曼编码的文本文件压缩与解压缩,使用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

评论

共有 条评论