哈夫曼数据结构实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档