哈夫曼数据结构实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告
班级: 姓名: 学号:
E-mail: 日期:
◎实验题目:
•P149 5.2 哈夫曼编/译码器
•完成Huffman 编码的译码过程。即输入一个码串,请翻译成相应的字符串。要求有编码过程和解码过程。
(一) 需求分析
1.本程序中,输入是字符串,包括‘+’,‘-’,‘*’,‘/’,‘(’,‘)’,以及0~9,在输入的末尾需要加上‘#’作为标记。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入相应数据,若正确则输出正确结果,若运算无解,则输入‘error’。
3.程序执行的命令包括:
(1)从文件读取字符和权值。
(2)构建哈夫曼树。
(3)输出构建的哈夫曼树。
(4)选择1:对输入的字符串编码。
(5)选择2:对输入的数字译码。
(6)选择0:结束。
4.测试数据
输入
1
A BGH
输出
字母:A 编码:1010
字母:编码:110
字母:B 编码:100100
字母:G 编码:100101
字母:H 编码:0000
(二) 概要设计
(三) 详细设计
#include
#include
#include
typedef struct
{
int weight; //节点权值
int parent,lchild,rchild; //左右孩子的节点
}htnode,*huffmantree;
typedef char * *huffmancode;
void select (huffmantree ht,int n,int *s1,int *s2) //挑选权值较小的两个节点{
int i,j,temp;
for(i=1;i<=n;i++)
if(ht[i].parent==0)
{
*s1=i;
break;
}
for(j=i+1;j<=n;j++)
if(ht[j].parent==0)
{
*s2=j;
break;
}
for(i=1;i<=n;i++) //挑选权值较小左节点
{
if(ht[i].parent==0)
if(ht[*s1].weight>ht[i].weight)
if(*s2!=i)
*s1=i;
}
for(j=1;j<=n;j++) //挑选权值较小右节点
{
if(ht[j].parent==0)
if(ht[*s2].weight>ht[j].weight)
if(*s1!=j)
*s2=j;
}
if(*s1>*s2)
{
temp=*s1;
*s1=*s2;
*s2=temp;
}
}
//求哈夫曼书的算法
void huffmancoding(huffmantree ht,huffmancode hc,int *w,int n)
{
int i,m;
int start,c,f;
int s1,s2;
char *cd;
if(n<=1) //n小于2无需构造赫夫曼树return ;
m=2*n-1; //一共有m=2n-1个节点
ht=(huffmantree) malloc((m+1)*sizeof(htnode));//0 号单元没用;
for(i=1;i<=n;i++) //数组初始化
{
ht[i].weight=w[i-1];
ht[i].parent=0;
ht[i].lchild=0;
ht[i].rchild=0;
}
for(;i<=m;++i)
{
-
ht[i].weight=0;
ht[i].parent=0;
ht[i].lchild=0;
ht[i].rchild=0;
}
for(i=n+1;i<=m;i++)
{
select(ht,i-1,&s1,&s2);
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;
}
//从叶子到根节点的逆向求每个字符的赫夫曼编码
cd=(char*)malloc(n*sizeof(char)); //分配球编码的工作空间
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';
else cd[--start]='1';
}
hc[i]=(char*)malloc((n-start)*sizeof(char)); //为第i个字符编码分配空间
strcpy(hc[i],&cd[start]); //从cd复制编码(字符串)到hc }
}
void bianma(char p[],char s[],huffmancode hc)//编码
{
int i,j;
for (i=0;p[i]!='\0';i++)
{
for (j=0;j<27;j++)
{
if (p[i]==s[j])
{
printf("字母:%c 编码:%s\n",p[i],hc[j+1]);
break;