哈弗曼编码与译码Word下载.docx
- 文档编号:16158874
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:11
- 大小:18.43KB
哈弗曼编码与译码Word下载.docx
《哈弗曼编码与译码Word下载.docx》由会员分享,可在线阅读,更多相关《哈弗曼编码与译码Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
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)){
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈弗曼 编码 译码