问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

急求lzw算法的英文文本压缩C语言源代码!

发布网友 发布时间:2022-05-06 12:12

我来回答

4个回答

热心网友 时间:2022-06-30 12:07

#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>//用来计算压缩的时间
using namespace std;

//定义常数
const int MAX = 1000003;//最大code数,是一个素数,求模是速度比较快
const int ascii = 256; //ascii代码的数量
const int ByteSize = 8; //8个字节

struct Element//hash表中的元素
{
int key;
int code;
Element *next;
}*table[MAX];//hash表

int hashfunction(int key)//hash函数
{
return key%MAX;
}
void hashinit(void)//hash表初始化
{
memset(table,0,sizeof(table));
}
void hashinsert(Element element)//hash表的插入
{
int k = hashfunction(element.key);
if(table[k]!=NULL)
{
Element *e=table[k];
while(e->next!=NULL)
{
e=e->next;
}
e->next=new Element;
e=e->next;
e->key = element.key;
e->code = element.code;
e->next = NULL;
}
else
{
table[k]=new Element;
table[k]->key = element.key;
table[k]->code = element.code;
table[k]->next = NULL;
}
}
bool hashfind(int key,Element &element)//hash表的查找
{
int k = hashfunction(key);
if(table[k]!=NULL)
{
Element *e=table[k];
while(e!=NULL)
{
if(e->key == key)
{
element.key = e->key;
element.code = e->code;
return true;
}
e=e->next;
}
return false;
}
else
{
return false;
}
}
void compress(void)//压缩程序
{
//打开一个流供写入
FILE *fp;
fp = fopen("result.dat", "wb");

Element element;
int used;
char c;
int pcode, k;

for(int i=0;i<ascii;i++)
{
element.key = i;
element.code = i;
hashinsert(element);
}
used = ascii;

c = getchar();
pcode = c;
while((c = getchar()) != EOF)
{
k = (pcode << ByteSize) + c;
if(hashfind(k, element))
pcode = element.code;
else
{
//cout<<pcode<<' ';
fwrite(&pcode, sizeof(pcode), 1, fp);
element.code = used++;
element.key = (pcode << ByteSize) | c;
hashinsert(element);
pcode = c;
}
}
//cout<<pcode<<endl;
fwrite(&pcode, sizeof(pcode), 1, fp);

}
int main(void)
{
int t1,t2;

//欲压缩的文本文件
//freopen("input.txt","r",stdin);
freopen("book5.txt","r",stdin);

t1=time(NULL);
hashinit();
compress();
t2=time(NULL);

cout<<"Compress complete! See result.dat."<<endl;
cout<<endl<<"Total use "<<t2-t1<<" seconds."<<endl;

热心网友 时间:2022-06-30 12:07

我也正需要一个,参考楼上的

热心网友 时间:2022-06-30 12:08

/*LZW就是通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩*/#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>//用来计算压缩的时间
using
namespace
std;//定义常数
const
int
MAX
=
1000003;//最大code数,是一个素数,求模是速度比较快
const
int
ascii
=
256;
//ascii代码的数量
const
int
ByteSize
=
8;
//8个字节struct
Element//hash表中的元素
{
int
key;
int
code;
Element
*next;
}*table[MAX];//hash表int
hashfunction(int
key)//hash函数
{
return
key%MAX;
}
void
hashinit(void)//hash表初始化
{
memset(table,0,sizeof(table));
}
void
hashinsert(Element
element)//hash表的插入
{
int
k
=
hashfunction(element.key);
if(table[k]!=NULL)
{

Element
*e=table[k];

while(e->next!=NULL)

{

e=e->next;

}

e->next=new
Element;

e=e->next;

e->key
=
element.key;

e->code
=
element.code;

e->next
=
NULL;
}
else
{

table[k]=new
Element;

table[k]->key
=
element.key;

table[k]->code
=
element.code;

table[k]->next
=
NULL;
}
}
bool
hashfind(int
key,Element
&element)//hash表的查找
{
int
k
=
hashfunction(key);
if(table[k]!=NULL)
{

Element
*e=table[k];

while(e!=NULL)

{

if(e->key
==
key)

{

element.key
=
e->key;

element.code
=
e->code;

return
true;

}

e=e->next;

}

return
false;
}
else
{

return
false;
}
}
void
compress(void)//压缩程序
{
//打开一个流供写入
FILE
*fp;
fp
=
fopen("result.dat",
"wb");

Element
element;
int
used;
char
c;
int
pcode,
k;

for(int
i=0;i<ascii;i++)
{

element.key
=
i;

element.code
=
i;

hashinsert(element);
}
used
=
ascii;

c
=
getchar();
pcode
=
c;
while((c
=
getchar())
!=
EOF)
{

k
=
(pcode
<<
ByteSize)
+
c;

if(hashfind(k,
element))

pcode
=
element.code;

else

{

//cout<<pcode<<'
';

fwrite(&pcode,
sizeof(pcode),
1,
fp);

element.code
=
used++;

element.key
=
(pcode
<<
ByteSize)
|
c;

hashinsert(element);

pcode
=
c;

}
}
//cout<<pcode<<endl;
fwrite(&pcode,
sizeof(pcode),
1,
fp);

}
int
main(void)
{
int
t1,t2;

//欲压缩的文本文件
char
xx[100]={0};
printf("请输入要压缩的文件:");
gets(xx);
freopen(xx,"r",stdin);

t1=time(NULL);
hashinit();
compress();
t2=time(NULL);

cout<<"Compress
complete!
See
result.dat."<<endl;
cout<<endl<<"Total
use
"<<t2-t1<<"
seconds."<<endl;
}

热心网友 时间:2022-06-30 12:08

/*LZW就是通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>//用来计算压缩的时间
using
namespace
std;
//定义常数
const
int
MAX
=
1000003;//最大code数,是一个素数,求模是速度比较快
const
int
ascii
=
256;
//ascii代码的数量
const
int
ByteSize
=
8;
//8个字节
struct
Element//hash表中的元素
{
int
key;
int
code;
Element
*next;
}*table[MAX];//hash表
int
hashfunction(int
key)//hash函数
{
return
key%MAX;
}
void
hashinit(void)//hash表初始化
{
memset(table,0,sizeof(table));
}
void
hashinsert(Element
element)//hash表的插入
{
int
k
=
hashfunction(element.key);
if(table[k]!=NULL)
{

Element
*e=table[k];

while(e->next!=NULL)

{

e=e->next;

}

e->next=new
Element;

e=e->next;

e->key
=
element.key;

e->code
=
element.code;

e->next
=
NULL;
}
else
{

table[k]=new
Element;

table[k]->key
=
element.key;

table[k]->code
=
element.code;

table[k]->next
=
NULL;
}
}
bool
hashfind(int
key,Element
&element)//hash表的查找
{
int
k
=
hashfunction(key);
if(table[k]!=NULL)
{

Element
*e=table[k];

while(e!=NULL)

{

if(e->key
==
key)

{

element.key
=
e->key;

element.code
=
e->code;

return
true;

}

e=e->next;

}

return
false;
}
else
{

return
false;
}
}
void
compress(void)//压缩程序
{
//打开一个流供写入
FILE
*fp;
fp
=
fopen("result.dat",
"wb");

Element
element;
int
used;
char
c;
int
pcode,
k;

for(int
i=0;i<ascii;i++)
{

element.key
=
i;

element.code
=
i;

hashinsert(element);
}
used
=
ascii;

c
=
getchar();
pcode
=
c;
while((c
=
getchar())
!=
EOF)
{

k
=
(pcode
<<
ByteSize)
+
c;

if(hashfind(k,
element))

pcode
=
element.code;

else

{

//cout<<pcode<<'
';

fwrite(&pcode,
sizeof(pcode),
1,
fp);

element.code
=
used++;

element.key
=
(pcode
<<
ByteSize)
|
c;

hashinsert(element);

pcode
=
c;

}
}
//cout<<pcode<<endl;
fwrite(&pcode,
sizeof(pcode),
1,
fp);

}
int
main(void)
{
int
t1,t2;

//欲压缩的文本文件
char
xx[100]={0};
printf("请输入要压缩的文件:");
gets(xx);
freopen(xx,"r",stdin);

t1=time(NULL);
hashinit();
compress();
t2=time(NULL);

cout<<"Compress
complete!
See
result.dat."<<endl;
cout<<endl<<"Total
use
"<<t2-t1<<"
seconds."<<endl;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
邯郸自驾游到青岛马壕运河遗址推荐线路 株洲自驾到青岛马壕运河遗址途径地方 梧州回青岛马壕运河遗址要几个小时 石嘴山到青岛马壕运河遗址要多少油钱 可不可以用开水敷脸 开水能不能敷脸 发动机和发电机区别?? 电音之王朴智妍MV的图片? 电音之王mv里跳舞的是谁 自己怎样开网站 怎样把一个网页设置为主页 哪里有?2010江西省普通高中历史学业水平考试大纲说明 Struts2 写入数据库出现乱码问题 新手求教:linux 中permission denied的问题 有关音频“反逆的鲁路修主题曲集.-.[CODE.GEASS][COMPLETE.BEST].专辑.(Ape+Iso)”中kbps的问题 高中会考历史提纲 codeblocks 怎么代码提示 中国国家代码用英语怎么说 C++编程继续学习问题? codeblocks里经常出现这样一个白条,非常烦人,怎么把它设置关掉。。。。 为什么每个团队都需要 Code Review 代码大全(code complete)第2版90在哪买?多少钱? CODE COMPLETE怎么样 鸦片战争是哪个国家向中国发动的? 浦发信用卡注销后多久可以再申请 信用卡注销了多久能重新申请 第一次鸦片战争的时间和参战的国家? 如何买定投基金 如何买基金定投 多宝鱼 怎么做 联合国成立于哪一年!倡导国有哪些国家?对世界起什么作用? 求~~高中历史会考复习大纲~~~ 有高一历史的复习大纲吗? 高中历史会考纲要 对文科生有用吗 2011浙江高中历史会考复习提纲 求助,智能电视如何打开小米路由器上硬盘里的视频 移动硬盘链接小米路由器后,可以在手机上看硬盘内容,在索尼电视机上可以看吗,通过路由器访问移动硬盘。 tcl智能电视怎么连接小米路由器硬盘 非小米手机如何看小米路由器上硬盘里存的视频呢?貌似“小米路由器”这个app可以看,但是要先下载。 小米路由器没有网络手机怎么使用硬盘 安卓电视怎么访问小米路由器的外接硬盘 小米电视怎么查看小米路由硬盘 现在做得最好的钢铁交易平台哪个做得比较好?有好介绍的吗? 卖钢材有哪些网站 钢材交易B2B网站,有哪些?推荐几个比较好的,除了阿里巴巴。 windows自带的ie浏览器 图标怎么弄消失或者更换? 钢构宝是只做钢结构交易吗? 怎么把桌面的ie浏览器图标不显示 中国最大的建筑钢材现货交易网站是那几个? 怎样取消桌面的IE浏览器图标 摩托车转速表指针不动了是什么原因造成