哈夫曼码编译码器的实现供参考Word文档格式.docx
- 文档编号:17587014
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:13
- 大小:19.10KB
哈夫曼码编译码器的实现供参考Word文档格式.docx
《哈夫曼码编译码器的实现供参考Word文档格式.docx》由会员分享,可在线阅读,更多相关《哈夫曼码编译码器的实现供参考Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
typedefchar**HfCode;
//动态分配字符数组存储哈夫曼编码表
(7)基本操作的函数设计
voidInitHFMT(HFMTT);
//初始化哈夫曼树
voidInputWeight(HFMTT,char*weightFile);
//输入权值
voidSelectMin(HFMTT,inti,int*p1,int*p2);
//选择所有结点中较小的结点
voidCreatHFMT(HFMTT);
//构造哈夫曼树,T[2*n-1]为其根结点
voidPrintHFMT(HFMTT);
//输出向量状态表
voidprintHfCode(HfCodehc);
//输出字符的哈夫曼编码序列
HfCodehfEnCoding(HFMTT);
//利用构成的哈夫曼树生成字符的编码
voidprint_HuffmanTree(HFMTHT,intt,inti)//按树形形态输出哈夫曼树的形态
voidEncoder(char*original,char*codeFile,HfCodehc,HFMTHT);
//利用已建好的哈夫曼树,对original文件中要传输的原始数据进行编码,
//将编码结果存入文件codeFile中
voidDecoder(char*codeFile,char*textFile,HFMTHT);
//利用已建好的哈夫曼树,对传输到达的codeFile中的数据代码进行译码,
//将译码结果存入文件textFile中
2、实验要求
(1)、用C语言编程实现上述实验内容中的结构定义和算法。
(2)、要有main()函数,并且在main()函数中使用检测数据调用上述算法。
(3)、实验完成后撰写实验报告,实验报告的具体格式参见《实验报告须知》。
(4)、实验完成后把打印好的实验报告以及电子版的实验报告和源程序一并上交。
四、参考源代码:
#include<
string.h>
stdlib.h>
stdio.h>
iostream.h>
#defineMAXLEN100
typedefstruct//定义哈夫曼树中每个结点结构体类型
//定义一个整型权值变量
//定义左、右孩子及双亲指针
//动态分配字符数组存储哈夫曼编码表
intn;
voidInitHFMT(HFMTT)
//初始化哈夫曼树
inti;
printf("
\n\t\t请输入共有多少个权值(小于100):
"
);
scanf("
%d"
&
n);
getchar();
for(i=0;
i<
2*n-1;
i++)
{
T[i].weight=0;
T[i].lchild=-1;
T[i].rchild=-1;
T[i].parent=-1;
}
}
voidInputWeight(HFMTT,char*weightFile)
intw;
intn;
FILE*fp;
if((fp=fopen(weightFile,"
r"
))!
=NULL)
fscanf(fp,"
%d\n"
for(i=0;
i<
n;
i++)
{
ch=fgetc(fp);
fscanf(fp,"
w);
T[i].ch=ch;
T[i].weight=w;
}
}
fclose(fp);
voidSelectMin(HFMTT,inti,int*p1,int*p2)
//选择所有结点中两个结点较小的结点
longmin1=999999;
//预设两个值,并使它大于可能出现的最大权值
longmin2=999999;
intj;
for(j=0;
j<
=i;
j++)
if(T[j].parent==-1)
if(min1>
T[j].weight)
{
min1=T[j].weight;
//找出最小的权值
*p1=j;
//通过*p1带回序号
}
j++)
{
{
if(min2>
T[j].weight&
&
j!
=(*p1))
min2=T[j].weight;
//找出次最小的权值
*p2=j;
}//通过*p2带回序号
}
voidCreatHFMT(HFMTT)
inti,p1,p2;
InitHFMT(T);
InputWeight(T,"
weight.txt"
for(i=n;
SelectMin(T,i-1,&
p1,&
p2);
T[p1].parent=T[p2].parent=i;
//T[i].lchild=T[p1].weight;
//T[i].rchild=T[p2].weight;
T[i].lchild=p1;
T[i].rchild=p2;
T[i].weight=T[p1].weight+T[p2].weight;
voidPrintHFMT(HFMTT)//输出向量状态表
{
inti,k=0;
while(T[i].lchild!
=-1)
if(!
(k%2))
printf("
\n"
\t\t(%d%d),(%d%d)"
T[i].weight,T[i].lchild,T[i].weight,T[i].rchild);
k++;
break;
voidprintHfCode(HfCodehc)
for(inti=0;
printf("
%s"
hc[i]);
HfCodehfEnCoding(HFMTT)
intstart;
HfCodehc=newchar*[(n+1)*sizeof(char*)];
//分配n个字符编码
char*cd=newchar[n*sizeof(char)];
//分配求编码的工作空间
cd[n-1]='
\0'
;
//编码结束符
intc;
intf;
start=n-1;
for(c=i,f=T[i].parent;
f!
=-1;
c=f,f=T[f].parent)//从叶子结点到根逆向求编码
if(T[f].lchild==c)
cd[--start]='
0'
else
1'
hc[i]=newchar[(n-start)*sizeof(char)];
//为第i个编码分配空间
strcpy(hc[i],&
cd[start]);
\n%c:
T[i].ch,hc[i]);
returnhc;
voidprint_HuffmanTree(HFMTHT,intt,inti)
//按树形形态输出哈夫曼树的形态
if(HT[t].rchild!
=-1)//先打印出右子树
print_HuffmanTree(HT,HT[t].rchild,i+1);
for(intj=1;
=3*i;
j++)//打印空格表示结点所在的层次
"
//再输出根结点
if(HT[t].lchild!
=-1||HT[t].rchild!
=-1)
HT[t].weight);
else
%c(%d)\n"
HT[t].ch,HT[t].weight);
//最后输出左子树
=-1)
print_HuffmanTree(HT,HT[t].lchild,i+1);
voidEncoder(char*original,char*codeFile,HfCodehc,HFMTHT)
//利用已建好的哈夫曼树,对original文件中要传输的原始数据进行编码,
//将编码结果存入文件codeFile中.
char*str;
//用于存储需编码内容
inti=0;
charch;
intk=0;
FILE*fin;
FILE*fout;
if((fin=fopen(original,"
fscanf(fin,"
%c"
ch);
while(!
feof(fin))
//计算CodeFile中代码长度
fscanf(fin,"
}
fclose(fin);
str=newchar[k+1];
k=0;
str[k++]=ch;
str[k]='
//结束标志符
printf("
要编码的数据是:
%s\n"
str);
if((fout=fopen(codeFile,"
w"
while(str[k]!
='
)//将字符编码
for(i=0;
if(str[k]==HT[i].ch)
{
fprintf(fout,"
break;
}
已编码!
且存到文件CodeFile.dat中!
\n\n"
fclose(fout);
voidDecoder(char*codeFile,char*textFile,HFMTHT)
//将译码结果存入文件textFile中.
inti=0,k=0;
intj=n*2-1-1;
//表示从根结点开始往下搜索
char*bitStr;
//读取codeFile文本文件指针
经译码的内容为:
if((fin=fopen(codeFile,"
//计算CodeFile中代码长度
bitStr=newchar[k+1];
bitStr[k++]=ch;
bitStr[k]='
//结束标志符
if(HT==NULL)//还未建哈夫曼树
请先编码!
return;
if((fout=fopen(textFile,"
=NULL)//将字符形式的编码文件写入文件CodePrin中
while(bitStr[i]!
)
if(bitStr[i]=='
j=HT[j].lchild;
//往左走
else
j=HT[j].rchild;
//往右走
if(HT[j].rchild==-1)//到达叶子结点
{
ch=HT[j].ch;
fprintf(fout,"
ch);
j=n*2-1-1;
//表示重新从根结点开始往下搜索
i++;
}//while
fclose(fout);
\n译码成功且已存到文件textFile.txt\n\n"
voidmain()//主函数
HFMTHT;
CreatHFMT(HT);
PrintHFMT(HT);
HfCodehc=hfEnCoding(HT);
\n哈夫曼树形态为:
print_HuffmanTree(HT,2*n-2,0);
Encoder("
original.txt"
"
codefile.txt"
hc,HT);
Decoder("
codeFile.txt"
"
textfile.txt"
HT);
五、运行测试
测试数据:
(1)利用数据调试程序。
(2)用下表给出的字符集和频度计数建立哈曼树,并实现以下报文的编码和译码:
“THISPROGRAMISMYFAVORITE”。
字符
A
B
C
D
E
F
G
H
I
J
K
L
M
频数
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼码编译码器的实现 供参考 哈夫曼码编 译码器 实现 参考
![提示](https://static.bdocx.com/images/bang_tan.gif)