哈夫曼算法Word文档格式.docx
《哈夫曼算法Word文档格式.docx》由会员分享,可在线阅读,更多相关《哈夫曼算法Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
![哈夫曼算法Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/26/b91e41cf-7097-4d30-a1e8-850a48c075fc/b91e41cf-7097-4d30-a1e8-850a48c075fc1.gif)
printf("
\n%s\n"
message);
exit(-1);
}
/*LZSSParameters*/
#defineN
4096
/*Sizeofstringbuffer*/
#defineF
60
//*Sizeoflook-aheadbuffer60
#defineTHRESHOLD
2
#defineNIL
N
/*Endoftree'
snode
*/
unsignedchar
text_buf[N+F-1];
//-1
int
match_position,match_length,
lson[N+1],rson[N+257],dad[N+1];
voidInitTree(void)
/*Initializingtree*/
i;
for(i=N+1;
i<
=N+256;
i++)
rson[i]=NIL;
/*root*/
for(i=0;
N;
dad[i]=NIL;
/*node*/
voidInsertNode(intr)
/*Insertingnodetothetree*/
i,p,cmp;
unsignedchar
*key;
unsignedc;
cmp=1;
key=&
text_buf[r];
p=N+1+key[0];
rson[r]=lson[r]=NIL;
match_length=0;
for(;
;
){
if(cmp>
=0){
if(rson[p]!
=NIL)
p=rson[p];
else{
rson[p]=r;
dad[r]=p;
return;
}else{
if(lson[p]!
p=lson[p];
lson[p]=r;
for(i=1;
F;
if((cmp=key[i]-text_buf[p+i])!
=0)
break;
if(i>
THRESHOLD){
match_length){
match_position=((r-p)&
(N-1))-1;
if((match_length=i)>
=F)
if(i==match_length){
if((c=((r-p)&
(N-1))-1)<
match_positon){
match_position=c;
dad[r]=dad[p];
lson[r]=lson[p];
rson[r]=rson[p];
dad[lson[p]]=r;
dad[rson[p]]=r;
if(rson[dad[p]]==p)
rson[dad[p]]=r;
else
lson[dad[p]]=r;
dad[p]=NIL;
/*removep*/
voidDeleteNode(intp)
/*Deletingnodefromthetree*/
q;
if(dad[p]==NIL)
/*unregistered*/
if(rson[p]==NIL)
q=lson[p];
if(lson[p]==NIL)
q=rson[p];
if(rson[q]!
=NIL){
do{
q=rson[q];
}while(rson[q]!
=NIL);
rson[dad[q]]=lson[q];
dad[lson[q]]=dad[q];
lson[q]=lson[p];
dad[lson[p]]=q;
rson[q]=rson[p];
dad[rson[p]]=q;
dad[q]=dad[p];
rson[dad[p]]=q;
lson[dad[p]]=q;
/*Huffmancodingparameters*/
#defineN_CHAR
(256-THRESHOLD+F)
/*charactercode(=0..N_CHAR-1)*/
#defineT
(N_CHAR*2-1)
/*Sizeoftable*/
#defineR
(T-1)
/*rootposition*/
#defineMAX_FREQ
0x8000
/*updatewhencumulativefrequency*/
/*reachestothisvalue*/
typedefunsignedcharuchar;
/*
*Tablesforencoding/decodingupper6bitsof
*slidingdictionarypointer
/*encodertable*/
ucharp_len[64]={
0x03,0x04,0x04,0x04,0x05,0x05,0x05,0x05,
0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,
0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,
0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,
0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08
};
ucharp_code[64]={
0x00,0x20,0x30,0x40,0x50,0x58,0x60,0x68,
0x70,0x78,0x80,0x88,0x90,0x94,0x98,0x9C,
0xA0,0xA4,0xA8,0xAC,0xB0,0xB4,0xB8,0xBC,
0xC0,0xC2,0xC4,0xC6,0xC8,0xCA,0xCC,0xCE,
0xD0,0xD2,0xD4,0xD6,0xD8,0xDA,0xDC,0xDE,
0xE0,0xE2,0xE4,0xE6,0xE8,0xEA,0xEC,0xEE,
0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,
0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF
/*decodertable*/
uchard_code[256]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,
0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,
0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,
0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,0x0B,
0x0C,0x0C,0x0C,0x0C,0x0D,0x0D,0x0D,0x0D,
0x0E,0x0E,0x0E,0x0E,0x0F,0x0F,0x0F,0x0F,
0x10,0x10,0x10,0x10,0x11,0x11,0x11,0x11,
0x12,0x12,0x12,0x12,0x13,0x13,0x13,0x13,
0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,
0x16,0x16,0x16,0x16,0x17,0x17,0x17,0x17,
0x18,0x18,0x19,0x19,0x1A,0x1A,0x1B,0x1B,
0x1C,0x1C,0x1D,0x1D,0x1E,0x1E,0x1F,0x1F,
0x20,0x20,0x21,0x21,0x22,0x22,0x23,0x23,
0x24,0x24,0x25,0x25,0x26,0x26,0x27,0x27,
0x28,0x28,0x29,0x29,0x2A,0x2A,0x2B,0x2B,
0x2C,0x2C,0x2D,0x2D,0x2E,0x2E,0x2F,0x2F,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
uchard_len[256]={
0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,
unsignedfreq[T+1];
/*cumulativefreqtable*/
*pointingparentnodes.
*area[T..(T+N_CHAR-1)]arepointersforleaves
intprnt[T+N_CHAR];
/*pointingchildrennodes(son[],son[]+1)*/
intson[T];
unsignedgetbuf=0;
uchargetlen=0;
intGetBit(void)
/*getonebit*/
inti;
while(getlen<
=8){
if((i=getc(infile))<
0)i=0;
getbuf|=i<
<
(8-getlen);
getlen+=8;
i=getbuf;