哈夫曼编译码器闽江学院.docx
- 文档编号:30136984
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:15
- 大小:231.89KB
哈夫曼编译码器闽江学院.docx
《哈夫曼编译码器闽江学院.docx》由会员分享,可在线阅读,更多相关《哈夫曼编译码器闽江学院.docx(15页珍藏版)》请在冰豆网上搜索。
哈夫曼编译码器闽江学院
实验四哈夫曼编/译码器
【实验课程名称】数据结构
【实验项目名称】哈夫曼编/译码器
【实验目的】
1掌握哈夫曼编码、译码的实现;
2学会设计一个完整的编/译码系统
【实验仪器及环境】计算机,windowxp操作系统,VC++6.0
【实验内容及步骤】
1.初始化:
(Initialization)。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存入文件hfmTree.txt中。
2.编码:
(Edcoding)。
利用建好的哈夫曼树(如不在内存则从文件hamTree.txt中读入),对文件TobeTran.txt中的正文进行编码,然后将结果存入文件CodeFile.txt中。
3.译码:
(Decoding)。
利用已建好的哈夫曼树将文件CodeFile.txt中的代码进行译码,结果存入文件TextFile.txt中。
4.打印代码文件(Print)。
将文件CodeFile.txt以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrin中。
5.打印哈夫曼树(Treeprinting)。
将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。
【测试数据及实验结果】
(1)利用教科书例6-2中的数据调试程序。
(2)利用下表给出的字符集合频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:
“THISPROGRAMISMYFAVORITE”。
字符
A
B
C
D
E
F
G
H
I
J
K
L
M
频度
186
64
13
22
32
103
21
15
47
57
1
5
32
20
字符
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
频度
57
63
15
1
48
51
80
23
8
18
1
16
1
【实验小结】
1.要初步学会哈夫曼编码。
2.文件的使用;
3.队列的作用;
4.树的输出;
【源代码说明】
1文件名:
#include
#include"string"
#include"huffman.h"
usingnamespacestd;
intmain()
{
HuffmanTreeHT,HT2;
HuffmanCodeHC,HC2;
charstr[56];
intn=27;
intw[27];
intww[27]={186,64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1};
inti;
gets(str);
n=strlen(str);
for(i=0;i { if(str[i]=='') w[i]=ww[0]; else w[i]=str[i]-64; } for(i=0;i cout< Initialization(HT2,w,n);//初始化赫夫曼编码 Edcoding(HC2,n);//赫夫曼编码 Decoding(HT2,n);//赫夫曼译码 Print(n);//输出赫夫曼凹入表 Tree_printing(HT2,n);//输出赫夫曼树 return0; } #include #include #include usingnamespacestd; typedefstruct//节点结构体 { unsignedintweight;//数据域 unsignedintparent,lchild,rchild;//双亲,孩子位置 }HTNode,*HuffmanTree; typedefchar**HuffmanCode; voidInitialization(HuffmanTree&HT,int*w,intn) { //初始化赫夫曼表,进行赫夫曼表的创建 FILE*fp;//文件指针 if((fp=fopen("hfmTree.txt","w"))==NULL) cout<<"ERROR! "< inti,j; intmin1,min2,min1_pos,min2_pos; HuffmanTreep; if(n<1) return; HT=newHTNode[2*n]; for(p=HT+1,i=1;i<=2*n;i++,w++,p++) { if(i<=n) p->weight=*w; elsep->weight=0; p->lchild=0; p->parent=0; p->rchild=0; } for(i=n+1;i<2*n;i++) { min1=65535;//赋值于最大整数 min2=65535;//赋值于最大整数 for(p=HT+1,j=1;p { //一趟查找最小数和次最小数 if(! p->parent&&p->weight<=min1&&p->weight) { //找最小数 min2=min1;//将之前的最小数给次最小数 min2_pos=min1_pos;//将之前的最小数的位置给次最小数的位置 min1=p->weight;//将找到的最小数给之前的最小数 min1_pos=j; } else { //找次最小数 if(p->weight&&! p->parent&&p->weight { min2=p->weight; min2_pos=j; } } } HT[i].weight=HT[min1_pos].weight+HT[min2_pos].weight;//父亲的重量是两个数的重量的总和 HT[min1_pos].parent=i; HT[min2_pos].parent=i; HT[i].lchild=min1_pos min1_pos: min2_pos;//左孩子是两个位置的最小 HT[i].rchild=min1_pos>min2_pos? min1_pos: min2_pos;//右孩子是两个位置的最大 } for(i=1;i<2*n;i++) { //输出赫夫曼表,并把它存入fp所指向的文件里 cout< < fprintf(fp,"%d",HT[i].weight);fprintf(fp,"%d",HT[i].parent); fprintf(fp,"%d",HT[i].lchild);fprintf(fp,"%d\n",HT[i].rchild);//写入文件 } fclose(fp);//关闭文件 } voidEdcoding(HuffmanCode&HC,intn) { //赫夫曼编码,并把编码写入文件中 inti; FILE*fp1,*fp;//TobeTran.txt fp=fopen("hfmTree.txt","r");//打开文件 HuffmanTreeHT; HT=newHTNode[2*n];//开辟内存 fp1=fopen("CodeFile.txt","w");//打开文件 HC=newchar*[n]; for(i=1;i<2*n;i++) { //将文件里存的信息输出到HT fscanf(fp,"%d%d%d%d",&HT[i].weight,&HT[i].parent,&HT[i].lchild,&HT[i].rchild);} fclose(fp);//关闭文件 fp=fopen("CodeFile.txt","w"); for(i=1;i<2*n;i++) //输出内存中的赫夫曼表 cout< intstart; char*cd; intc,f; cd=newchar[n]; cd[n-1]='\0'; for(i=1;i<=n;++i) { //赫夫曼编码过程 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';} //左边为0 if(HT[f].rchild==c) {cd[--start]='1';} //右边为1 HC[i]=newchar[n-start];//开辟内存 strcpy(HC[i],&cd[start]);//赋值编码 } cout< fprintf(fp1,"%s\n",HC[i]); } fclose(fp);//关闭文件 fclose(fp1);//关闭文件 delete[]cd;//释放内存 } voidDecoding(HuffmanTreeHT,intn) { //3.译码,利用已建好的哈夫曼树将文件CodeFile.txt中的代码进行译码,结果存入文件TextFile.txt中。 FILE*fp,*fp1;//文件指针 inti,j,Num,Pos; char*cd; cd=newchar[n]; fp1=fopen("TextFile.txt","w");//打开文件 fp=fopen("CodeFile.txt","r");//打开文件 for(i=1;i<=n;i++) { //从文件中读取到HT中 Pos=2*n-1; fscanf(fp,"%s",cd); for(j=0;j {if(cd[j]=='1') {Pos=HT[Pos].rchild;} if(cd[j]=='0') {Pos=HT[Pos].lchild;} } Num=HT[Pos].weight; fprintf(fp1,"%d\n",Num); //存入文件中 } fclose(fp);//关闭文件 fclose(fp1);//关闭文件 } voidPrint(intn) { //打印代码文件(Print)将文件CodeFile.txt以紧凑格式显示在终端上,每行50个代码。 同时将此字符形式的编码文件写入文件CodePrin中。 FILE*fp;//文件指针 char*cd; cd=newchar[n];//开辟内存 inti=1; fp=fopen("CodeFile.txt","r");//打开文件 for(intj=0;j { //从文件中读取到cd fscanf(fp,"%s",cd); i+=(strlen(cd)+1); if(i<50)//控制一行50个字符 cout< elseif(i==50) {i=1;cout< else { for(intz=0;i+z<=50;z++) cout< i=1; cout< for(i++;cd[z]! ='\0';z++) cout< cout<<""; i++; } } } voidTree_printing(HuffmanTreeHT,intn) { //打印哈夫曼树。 将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。 intfront=0,rear=0; intQ[60]; intp; inti=0,j=1; Q[rear++]=2*n-1; //借助栈进行层次遍历 while(rear! =front) { p=Q[front++]; cout< for(intz=1;z<=i;z++) z*=2; i++; if(HT[p].lchild)Q[rear++]=HT[p].lchild; if(HT[p].rchild)Q[rear++]=HT[p].rchild; } } 2操作说明: (1)利用教科书例6-2中的数据调试程序。 (2)利用下表给出的字符集合频度的实际统计数据建立哈夫曼树,并实现以下报文的编 码和译码: “THISPROGRAMISMYFAVORITE”。 1.voidInitialization(HuffmanTree&HT,int*w,intn) 2. 3. 4.voidEdcoding(HuffmanCode&HC,intn) 实验总结: 初步学会赫夫曼编码,提高了自己的编程水平和对数据结构的研究,使自己的思想升华了不少。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼编 译码器 闽江 学院