哈夫曼编译码系统实验报告.docx
- 文档编号:23261093
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:20
- 大小:115.89KB
哈夫曼编译码系统实验报告.docx
《哈夫曼编译码系统实验报告.docx》由会员分享,可在线阅读,更多相关《哈夫曼编译码系统实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
哈夫曼编译码系统实验报告
数学与计算机学院数据结构实验报告
年级大二学号*********姓名*******成绩
专业电气信息类(计算机)实验地点主楼402指导教师
实验项目
实验日期2010年11月20日
一、实验目的和要求
通过对简单哈夫曼编/译码系统的设计与实现来熟练掌握树型结构在实际问题中的应用。
此实验可以作为综合实验,阶段性实验时可以选择其中的几个功能来设计和实现。
二、问题描述
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发编写一个哈夫曼码的编/译码系统。
三、数据结构设计
1、构造哈夫曼树时使用静态链表作为哈夫曼树的存储。
在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1;
描述结点的数据类型为:
structHNodeType
{
chardata;//结点字符
intweight;//结点权值
intparent;
intlchild;
intrchild;
intlevel;
};
2、求哈夫曼树编码时使用一维结构数组HuffCode作为哈夫曼编码信息的存储。
求哈夫曼编码,实质上就是在已建立的哈夫曼树中,从叶子结点开始,沿结点的双亲链域回退到根结点,每回退一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼码值,由于一个字符的哈夫曼编码是从根结点到相应叶子结点所经过的路径上各分支所组成的0、1序列,因此先得到的分支代码为所求编码为所求编码的低位码,后得到的分支代码为所求编码的高位码,所以设计如下数据类型:
structHCodeType
{
intbit[MAXBIT];
intstart;
};
3、文件hfmtree.txt、codefile.txt、textfile.txt。
四、功能设计
(1)接收原始数据:
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmtree.dat中。
(2)编码:
利用已建好的哈夫曼树(如不在内存,则从文件hfmtree.dat中读入),对文件中的正文进行编码,然后将结果存入文件codefile.dat中。
(3)译码:
利用已建好的哈夫曼树将文件codefile.dat中的代码进行译码,结果存入文件textfile.dat中。
(4)打印编码规则:
即字符与编码的一一对应关系。
(5)打印哈夫曼树:
将已在内存中的哈夫曼树以直观的方式显示在终端上。
五、测试数据
(1)利用教科书中的数据调试程序。
令叶子结点个数n为4,权值集合为{1357},字符集合为{ABCD},并有如下对应关系,A——1,B——3,C——5,D——7,调用初始化功能模块可以正确接收这些数据。
调用建立哈夫曼树的功能模块,构造静态链表HuffNode的存储。
调用建立哈夫曼编码规则的功能模块,在屏幕上显示如下对应关系:
A——1,B——3,C——5,D——7。
调用哈夫曼编码的功能模块,在屏幕上输入“ABCD”后,显示编码:
调用译码的功能模块,输入代码串“111110100”后,屏幕上显示译码结果:
100101110——ABCD
调用打印哈夫曼树的功能模块。
在屏幕上显示哈夫曼树(用凹入法表示)。
打印编码规则:
(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
调用建立哈夫曼树的功能模块,构造静态链表HuffNode的存储。
调用建立哈夫曼编码规则的功能模块:
调用哈夫曼编码的功能模块:
调用译码的功能模块:
调用打印哈夫曼树的功能模块。
在屏幕上显示哈夫曼树(用凹入法表示)。
打印编码规则:
六、程序代码
//HUFF.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include
#include
#include
usingnamespacestd;
constintMAXBIT=100;
constintMAXVALUE=2000;
constintMAXNODE=100;
structHNodeType
{
chardata;
intweight;
intparent;
intlchild;
intrchild;
intlevel;
};
structHCodeType
{
intbit[MAXBIT];
intstart;
};
staticintn;
staticHNodeType*HuffNode;
staticHCodeType*HuffCode;
//字符和权值的输入及建立哈夫曼树模块******************************
HNodeType*huffmanTree()
{
cout<<"请输入字符总数:
"< cin>>n; HuffNode=newHNodeType[2*n-1]; inti,j; intm1,m2,x1,x2; //初始化 for(i=0;i<2*n-1;i++) { HuffNode[i].level=1; HuffNode[i].data='0'; HuffNode[i].weight=0; HuffNode[i].parent=-1; HuffNode[i].lchild=-1; HuffNode[i].rchild=-1; } //输入字符及权值 cout<<"请输入字符(可以识别空格,两个非空格字符之间请不要再加空格): "< cout<<"形如: (abc),(abbc)"< charc; flushall(); for(i=0;i { cin.get(c); HuffNode[i].data=c; } cout<<"字符对应的叶子结点的权值: "< for(i=0;i { cin>>HuffNode[i].weight; } //建立哈夫曼树 for(i=0;i { m1=m2=MAXVALUE; x1=x2=0; for(j=0;j { if(HuffNode[j].parent==-1&&HuffNode[j].weight { m2=m1; x2=x1; m1=HuffNode[j].weight; x1=j; } else { if(HuffNode[j].parent==-1&&HuffNode[j].weight { m2=HuffNode[j].weight; x2=j; } } } HuffNode[x1].level=n-i; HuffNode[x2].level=n-i;//结点在哈夫曼树的层次 HuffNode[x1].parent=n+i; HuffNode[x2].parent=n+i; HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight; HuffNode[n+i].lchild=x1; HuffNode[n+i].rchild=x2; } //输出哈夫曼树 cout<<"已成功建立哈夫曼树! "< for(i=0;i<2*n-1;i++) { cout< cout< cout< cout< cout< cout< } //把哈夫曼树写入文件 ofstreamoutFile; outFile.open("hfmtree.txt",ios: : out); for(i=0;i<2*n-1;i++) { outFile< outFile< outFile< outFile< outFile< outFile< } outFile.close(); cout<<"已成功建立哈夫曼树并存入文件hfmtree.txt! "< returnHuffNode; } //建立哈夫曼编码规则模块******************************************************** voidhuffmanCode() { HuffCode=newHCodeType[n]; HCodeTypecd; inti,j,c,p; //建立编码规则 for(i=0;i { cd.start=MAXBIT-1; c=i; p=HuffNode[c].parent; while(p! =-1) { if(HuffNode[p].lchild==c) cd.bit[cd.start]=0; else cd.bit[cd.start]=1; cd.start--; c=p; p=HuffNode[c].parent; } for(j=cd.start+1;j HuffCode[i].bit[j]=cd.bit[j]; HuffCode[i].start=cd.start; } //输出编码规则 cout<<"已成功建立以下编码规则并存入codefile.txt文件中! "< for(i=0;i { cout< for(j=HuffCode[i].start+1;j cout< cout< } //将编码规则写入文件 ofstreamoutFile("codefile.txt",ios: : out); for(i=0;i { outFile< for(j=HuffCode[i].start+1;j outFile< outFile< } outFile.close(); } //哈夫曼编码模块*************************************************** voidcoding() { cout<<"请输入要编码的字符串: "< strings; flushall(); getline(cin,s); cout< "< for(inti=0;i for(intj=0;j { if(s[i]==HuffNode[j].data) for(intk=HuffCode[j].start+1;k cout< else cout<<"您输入的编码不正确! "< } cout< } //哈夫曼译码模块*************************************************** voiddeCoding() { stringcode; cout<<"请输入要译码的编码序列: "< cin>>code; cout< "< intnext,root; for(inti=0;i<2*n-1;i++) if(HuffNode[i].parent==-1) root=i; ofstreamoutFile("txtfile.txt",ios: : out); for(inti=0;i { next=root; while(HuffNode[next].lchild! =-1&&HuffNode[next].rchild! =-1) { if(code[i]=='0') { next=HuffNode[next].lchild; i++; } else { next=HuffNode[next].rchild; i++; } } cout< outFile< i--; } cout< outFile.close(); } //打印哈夫曼树模块**************************************** voidprintHuffTree() { //凹入法打印哈夫曼树 for(inti=0;i { for(intj=0;j<2*n-1;j++) { if(HuffNode[j].level==i+1) { for(intk=0;k cout<<""; for(intk=0;k<60-HuffNode[j].level-i;k++) cout<<"*"; cout<<"("< if(j cout< cout< } } } } //输出编码规则模块************************************************** voidprintPrinciple() { for(inti=0;i { cout< for(intj=HuffCode[i].start+1;j cout< cout< } } //显示菜单函数******************************************************** voidmenu() { cout<<"请选择功能: "< cout<<"菜单: ------------输入字符和频度,建立哈夫曼树"< cout<<"2------------建立哈夫曼编码规则"< cout<<"3------------实现哈夫曼编码"< cout<<"4------------实现哈夫曼译码"< cout<<"5------------打印哈夫曼树"< cout<<"6------------打印编码规则"< cout<<"0------------退出程序"< } int_tmain(intargc,_TCHAR*argv[]) { cout<<"*****************欢迎使用**************************"< cout<<"输入字符和权值,建立哈夫曼树: "< huffmanTree(); intkey; do { menu(); cin>>key; switch(key) { case1: huffmanTree();break; case2: huffmanCode();break; case3: coding();break; case4: deCoding();break; case5: printHuffTree();break; case6: printPrinciple();break; case0: break; default: cout<<"输入错误! 请正确选择功能: "< cin>>key; } }while(key! =0); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼编 译码 系统 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)