哈弗曼编码与译码Word下载.docx

上传人:b****6 文档编号:16158874 上传时间:2022-11-21 格式:DOCX 页数:11 大小:18.43KB
下载 相关 举报
哈弗曼编码与译码Word下载.docx_第1页
第1页 / 共11页
哈弗曼编码与译码Word下载.docx_第2页
第2页 / 共11页
哈弗曼编码与译码Word下载.docx_第3页
第3页 / 共11页
哈弗曼编码与译码Word下载.docx_第4页
第4页 / 共11页
哈弗曼编码与译码Word下载.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

哈弗曼编码与译码Word下载.docx

《哈弗曼编码与译码Word下载.docx》由会员分享,可在线阅读,更多相关《哈弗曼编码与译码Word下载.docx(11页珍藏版)》请在冰豆网上搜索。

哈弗曼编码与译码Word下载.docx

E

F

G

H

I

J

K

L

M

频度

186

64

13

22

32

103

21

15

47

57

1

5

20

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

63

48

51

80

23

8

18

16

3.实现提示

(1)编码结果以文本方式存储在文件Codefile中。

(2)用户界面可以设计为“菜单”方式:

显示上述功能符号,再加上“Q”,表示退出运行Quit。

请用户键入一个选择功能符。

此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。

(3)在程序的一次执行过程中,第一次执行I,D或C命令之后,赫夫曼树已经在内存了,不必再读入。

每次执行中不一定执行I命令,因为文件hfmTree可能早已建好。

#include<

string.h>

stdio.h>

stdlib.h>

malloc.h>

typedefstruct{

charletter;

floatwt;

}hfm,*hfmlist;

//*************************全局变量************************************

unsignedints1,s2,n;

charchoose;

intDEPTH=0;

chara[20];

//***************Huffman树和Huffman编码的存储表示**********************

typedefstruct{

unsignedintweight;

unsignedintcode;

unsignedintparent,lchild,rchild;

}HTNode,*HuffmanTree;

//动态分配数组存储Huffman树

typedefchar**HuffmanCode;

//动态分配数组存储Huffman编码表

//***************************初始化Huffman树***************************

voidselect(HuffmanTreeHT,intl){

inta,b,c,j;

s1=s2=1;

a=b=1000;

for(j=1;

j<

=l;

j++){

if(HT[j].code==0){

c=HT[j].weight;

if(c<

a){b=a;

a=c;

s2=s1;

s1=j;

}

elseif(c<

b){b=c;

s2=j;

}//if

}//for

HT[s1].code=HT[s2].code=1;

}//select

voidHuffmanCoding(HuffmanTree&

HT,HuffmanCode&

HC,hfmlistHL,unsignedintn){

//w存放n个权值(均>

0),构造Huffman树HT,并求出n个字符的Huffman编码HC.

unsignedinti,f,start,c,m;

char*cd;

if(n<

=1)return;

m=2*n-1;

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));

for(i=1;

i<

=m;

++i){HT[i].weight=HT[i].parent=HT[i].lchild=HT[i].rchild=HT[i].code=0;

for(i=1;

=n;

++i)HT[i].weight=HL[i].wt;

for(i=n+1;

++i){

select(HT,i-1);

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;

HC=(HuffmanCode)malloc((n+1)*sizeof(char*));

cd=(char*)malloc(n*sizeof(char));

cd[n-1]='

\0'

;

start=n-1;

for(c=i,f=HT[i].parent;

f!

=0;

c=f,f=HT[f].parent)

if(HT[f].lchild==c)cd[--start]='

0'

elsecd[--start]='

1'

HC[i]=(char*)malloc((n-start)*sizeof(char));

strcpy(HC[i],cd+start);

free(cd);

//*************************文件操作*****************************

voidsave(char*p){

FILE*fp;

inti;

printf("

inputthename:

"

);

if((fp=fopen(gets(a),"

w+"

))==NULL){

cannotopenthefile!

\n"

exit(0);

}//if

for(i=0;

p[i]!

='

i++){

if(fwrite(p+i,sizeof(char),1,fp)!

=1){//fwrite函数写数据块

Filewriteerror!

exit(0);

}//for

fclose(fp);

}//save

//************************编码与译码操作**********************************

voidDecoding(HuffmanTreeHT,hfmlistHL,char*size,intn)//这个函数是用来译码的

{inti,j,k;

charp[130];

请输入需要译码的代码:

gets(p);

//接受需要译码的字符串

i=2*n-1;

k=0;

for(j=0;

p[j]!

if(p[j]=='

){if(HT[i].lchild!

=0)i=HT[i].lchild;

else{size[k++]=HL[i].letter;

i=2*n-1;

j--;

}

else{if(HT[i].rchild!

=0)i=HT[i].rchild;

if(p[j-1]=='

)size[k++]=HL[i].letter;

elsesize[k++]=HL[i].letter;

size[k]='

}//decoding

voidEncoding(HuffmanCodeHC,hfmlistHL,char*coding,intn){

inti,j,t,k=0;

charp[100];

printf("

请再次输入需要编码的文本:

for(i=0;

if((p[i]>

A'

&

p[i]<

Z'

)||p[i]=='

'

for(j=1;

j++)

if(p[i]==HL[j].letter)

for(t=0;

HC[j][t]!

t++)

coding[k++]=HC[j][t];

coding[k]='

}//encoding

//************************打印操作****************************

voidPrint(FILE*fp1,FILE*fp2){

//将文件fp1中的代码以紧凑格式显示在终端上,每行50个代码

//同时将此字符形式的编码文件写入文件fp2中

charc[200];

inti;

fgets(c,200,fp1);

c[i]=='

||c[i]=='

%c"

c[i]);

fprintf(fp2,"

if((i+1)/50*50==(i+1)){

}//Print

voidPreOrderTraverse(HuffmanTreeHT,intk,FILE*fp){

//先序遍历并打印树,结果存放于fp中,k为根结点的下标

=DEPTH-1;

i++)fprintf(fp,"

"

for(;

=DEPTH;

|------"

fprintf(fp,"

%d\n"

HT[k].weight);

if(HT[k].lchild!

=0){

DEPTH++;

PreOrderTraverse(HT,HT[k].lchild,fp);

DEPTH--;

if(HT[k].rchild!

PreOrderTraverse(HT,HT[k].rchild,fp);

if(HT[k].lchild==0&

HT[k].rchild==0)return;

return;

}//PreOrderTraverse

voidTreePrinting(HuffmanTreeHT,intn,FILE*fp){

//打印树HT,结果存于文件fp中,n为树的叶子结点数

inti,k;

=2*n;

i++)if(HT[i].parent==0){k=i;

bre

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1