今天给各位分享lzw编码c语言代码的知识,其中也会对lz编码和lzw编码进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、跪求C语言进行哈夫曼编码、算术编码和LZW编码,要求源程序要有注释。2、谁能提供个lzw压缩算法的c语言完整实现3、急求lzw算法的英文文本压缩C语言源代码!
跪求C语言进行哈夫曼编码、算术编码和LZW编码,要求源程序要有注释。
以下是哈夫曼编码
#includeiostream
#includemath.h
#includestring
#includeiomanip
using namespace std;
int n;
int isin(string str,char a)
{
int temp=0;
for(int i=0;istr.length();i++)
{
if(str[i]==a) temp=1;
}
return temp;
}
void bubble(double p[],string sign[])//排序
{
for(int i=0;in-1;i++)
{
for(int j=i+1;jn;j++)
{
if(p[i]p[j])
{
double temp=p[i];
p[i]=p[j];
p[j]=temp;
string m=sign[i];
sign[i]=sign[j];
sign[j]=m;
}
}
}
}
void huff(double tempp[],string tempstr[])
{
double p[20][20];
string sign[20][20];
sign[0][i]=tempstr[i]; //符号放在sign数组中
for(int i=0;in;i++)
{
p[0][i]=tempp[i]; //p数组放对应的概率(第1列中)
}
for(i=0;in-1;i++)
{
bubble(p[i],sign[i]); //第一次排序
for(int j=0;jn-2-i;j++)
{
p[i+1][j]=p[i][j]; //前n-2-i个概率重新放在p数组中(是数组的第2列中)
sign[i+1][j]=sign[i][j];
}
p[i+1][j]=p[i][j]+p[i][j+1];//第一次两个最小概率求和
sign[i+1][j]=sign[i][j]+sign[i][j+1];//符号跟随
for(j=n-1-i;jn;j++)
{
p[i+1][j]=0;
}
}
string final[20];
for(i=n-2;i=0;i–)
{
for(int k=0;kn;k++)
{
if(isin(sign[i][n-2-i],sign[0][k][0])) final[k]+=”0″;
if(isin(sign[i][n-1-i],sign[0][k][0])) final[k]+=”1″;
}
}
coutsetw(9)”哈弗曼编码如下:”endl;
for(i=0;in;i++)
{
coutsetw(7)sign[0][i]setw(7)p[0][i]setw(10)final[i]
setw(7)final[i].length()endl;
}
}
void main()
{
char a[50];
cout”该字符串符号为:”;
cina;
string s=a;
n=s.length();
char b[20][2];
for(int i=0;in;i++)
{
b[i][0]=a[i];
b[i][1]=’\0′;
}
string str[20];
for(i=0;in;i++)
{
str[i]=b[i];
}
double tempp[20];
cout”字符概率依次为:”;
for(i=0;in;i++)
{
cintempp[i];
}
huff(tempp,str);
}
谁能提供个lzw压缩算法的c语言完整实现
程序由五个模块组成。(1) lzw.h 定义了一些基本的数据结构,常量,还有变量的初始化等。#ifndef __LZW_H__
#define __LZW_H__
//——————————————————————————
#include stdio.h
#include stdlib.h
#include windows.h
#include memory.h
//——————————————————————————
#define LZW_BASE 0x102// The code base
#define CODE_LEN 12 // Max code length
#define TABLE_LEN 4099 // It must be prime number and bigger than 2^CODE_LEN=4096.
// Such as 5051 is also ok.
#define BUFFERSIZE 1024
//——————————————————————————
typedef struct
{
HANDLE h_sour; // Source file handle.
HANDLE h_dest; // Destination file handle.
HANDLE h_suffix; // Suffix table handle.
HANDLE h_prefix; // Prefix table handle.
HANDLE h_code; // Code table handle.
LPWORD lp_prefix; // Prefix table head pointer.
LPBYTE lp_suffix; // Suffix table head pointer.
LPWORD lp_code; // Code table head pointer. WORD code;
WORD prefix;
BYTE suffix; BYTE cur_code_len; // Current code length.[ used in Dynamic-Code-Length mode ]}LZW_DATA,*PLZW_DATA;
typedef struct
{
WORD top;
WORD index; LPBYTE lp_buffer;
HANDLE h_buffer;
BYTE by_left;
DWORD dw_buffer; BOOL end_flag;}BUFFER_DATA,*PBUFFER_DATA;
typedef struct //Stack used in decode
{
WORD index;
HANDLE h_stack;
LPBYTE lp_stack;}STACK_DATA,*PSTACK_DATA;
//——————————————————————————
VOID stack_create( PSTACK_DATA stack )
{
stack-h_stack = GlobalAlloc( GHND , TABLE_LEN*sizeof(BYTE) );
stack-lp_stack = GlobalLock( stack-h_stack );
stack-index = 0;
}
//——————————————————————————
VOID stack_destory( PSTACK_DATA stack )
{
GlobalUnlock( stack-h_stack );
GlobalFree ( stack-h_stack );
}
//——————————————————————————
VOID buffer_create( PBUFFER_DATA buffer )
{
buffer-h_buffer = GlobalAlloc( GHND, BUFFERSIZE*sizeof(BYTE) );
buffer-lp_buffer = GlobalLock( buffer-h_buffer );
buffer-top = 0;
buffer-index = 0;
buffer-by_left = 0;
buffer-dw_buffer = 0;
buffer-end_flag = FALSE;
}
//——————————————————————————
VOID buffer_destory( PBUFFER_DATA buffer )
{
GlobalUnlock( buffer-h_buffer );
GlobalFree ( buffer-h_buffer );
}
//——————————————————————————
VOID re_init_lzw( PLZW_DATA lzw ) //When code table reached its top it should
{ //be reinitialized.
memset( lzw-lp_code, 0xFFFF, TABLE_LEN*sizeof(WORD) );
lzw-code = LZW_BASE;
lzw-cur_code_len = 9;
}
//——————————————————————————
VOID lzw_create(PLZW_DATA lzw, HANDLE h_sour, HANDLE h_dest)
{
WORD i;
lzw-h_code = GlobalAlloc( GHND, TABLE_LEN*sizeof(WORD) );
lzw-h_prefix = GlobalAlloc( GHND, TABLE_LEN*sizeof(WORD) );
lzw-h_suffix = GlobalAlloc( GHND, TABLE_LEN*sizeof(BYTE) );
lzw-lp_code = GlobalLock( lzw-h_code );
lzw-lp_prefix = GlobalLock( lzw-h_prefix );
lzw-lp_suffix = GlobalLock( lzw-h_suffix );
lzw-code = LZW_BASE;
lzw-cur_code_len = 9;
lzw-h_sour = h_sour;
lzw-h_dest = h_dest;
memset( lzw-lp_code, 0xFFFF, TABLE_LEN*sizeof(WORD) );}
//——————————————————————————
VOID lzw_destory(PLZW_DATA lzw)
{
GlobalUnlock( lzw-h_code );
GlobalUnlock( lzw-h_prefix );
GlobalUnlock( lzw-h_suffix );GlobalFree( lzw-h_code );
GlobalFree( lzw-h_prefix );
GlobalFree( lzw-h_suffix );
}
//——————————————————————————
#endif(2) fileio.h 定义了一些文件操作#ifndef __FILEIO_H__
#define __FILEIO_H__
//——————————————————————————
#include stdio.h
#include stdlib.h
#include windows.h
//——————————————————————————
HANDLE file_handle(CHAR* file_name)
{
HANDLE h_file;
h_file = CreateFile(file_name,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
0,
NULL
);
return h_file;
}
//——————————————————————————
WORD load_buffer(HANDLE h_sour, PBUFFER_DATA buffer) // Load file to buffer
{
DWORD ret;
ReadFile(h_sour,buffer-lp_buffer,BUFFERSIZE,ret,NULL);
buffer-index = 0;
buffer-top = (WORD)ret;
return (WORD)ret;
}
//——————————————————————————
WORD empty_buffer( PLZW_DATA lzw, PBUFFER_DATA buffer)// Output buffer to file
{
DWORD ret;
if(buffer-end_flag) // The flag mark the end of decode
{
if( buffer-by_left )
{
buffer-lp_buffer[ buffer-index++ ] = (BYTE)( buffer-dw_buffer 32-buffer-by_left )(8-buffer-by_left);
}
}
WriteFile(lzw-h_dest, buffer-lp_buffer,buffer-index,ret,NULL);
buffer-index = 0;
buffer-top = ret;
return (WORD)ret;
}
//——————————————————————————
#endif
急求lzw算法的英文文本压缩C语言源代码!
#includeiostream
#includecstdio
#includecstring
#includectime//用来计算压缩的时间
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;iascii;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
{
//coutpcode’ ‘;
fwrite(pcode, sizeof(pcode), 1, fp);
element.code = used++;
element.key = (pcode ByteSize) | c;
hashinsert(element);
pcode = c;
}
}
//coutpcodeendl;
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;
coutendl”Total use “t2-t1” seconds.”endl;
lzw编码c语言代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于lz编码和lzw编码、lzw编码c语言代码的信息别忘了在本站进行查找喔。