当前位置:文档之家› 哈夫曼树

哈夫曼树

*******************实践教学*******************兰州理工大学计算机与通信学院2007年春季学期算法与数据结构课程设计题目:赫夫曼编译码器设计专业班级:软件工程05-1班姓名:张龙学号:05350507指导教师:王燕成绩:目录摘要 (1)前言 (2)正文 (3)1.采用类C语言定义相关的数据类型 (3)2.各模块的伪码算法 (7)3.函数的调用关系图 (13)4.调试分析 (13)5.测试结果 (14)6.源程序(带注释) (14)总结 (20)参考文献 (20)附件Ⅰ部分源程序代码 (21)摘要哈夫曼编译码器主要用于通信领域,能够实现数据的快速,有效的传输。

它利用哈夫曼树对数据进行编码,形成前缀编码,实现数据的有效压缩存放。

然后又通过某种遍历实现译码,从而达到快速远距离通信的目的。

关键词:哈夫曼树;前缀编码;译码前言利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。

对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼码的编/译码系统。

通过该题目的设计过程,可以加深理解树及二叉树的逻辑结构、存储结构,掌握树及二叉树上基本运算的实现。

进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养学生的动手能力。

正文1.采用类c语言定义相关的数据类型(1)结构体定义typedef struct{ int weight;char ch;int parent,lchild,rchild;}HTNode,*HuffmanTree; //动态分配数组存贮哈夫曼树。

typedef struct{char ch;char *chs;}HuffmanCode;typedef struct{char ch;int weight;}sw;typedef struct{HuffmanTree HT;HuffmanCode *HC;}huf;//哈夫曼树结构体。

从HT[i-1]选择parent为零且weight最小的两个节点,分别编号为n1,n2. (2)调用函数1)在给定权值中选择权值最小的两个节点。

void select(HTNode * HT,int n,int *n1,int *n2){int i=1; int n3;while(HT[i].parent!=0)i++;*n1=i;i++;while(HT[i].parent!=0) i++;*n2=i;if(HT[*n1].weight<HT[*n2].weight){ n3=*n1;*n1=*n2;*n2=n3;}for(i++;i<=n;i++){if(HT[i].parent==0){ if(HT[i].weight<HT[*n1].weight)*n1=i;else if(HT[i].weight<HT[*n2].weight)*n2=i;}}}2)进行哈夫曼编码。

huf * HuffmanCoding(HuffmanTree HT,HuffmanCode *HC,sw *w,int n,huf *HUF)//w存放n个字符的权值(均>0),构造哈夫曼树HT,并求出n个字符的哈夫曼编码HC.{int m,i,s1,s2,start,c,f;HuffmanTree p;char *cd;if(n<=1) return 0;m=2*n-1;HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//零号单元未用。

for(p=HT+1,i=1;i<=n;i++,p++,w++){p->weight=w->weight;p->ch=w->ch;p->parent=0;p->lchild=0;p->rchild=0;} for(;i<=m;i++,p++){p->weight=0;p->ch='^';p->parent=0;p->lchild=0;p->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;}//为哈夫曼编码审请空间。

HC=(HuffmanCode *)malloc((n+1)*sizeof(char));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].ch=HT[i].ch;HC[i].chs=(char*)malloc((n-start)*sizeof(char));strcpy(HC[i].chs,&cd[start]);printf("%c %-10s\n",HC[i].ch,HC[i].chs);}HUF->HT=HT;HUF->HC=HC;return HUF;}char * convert(char *chars,char *chars1,HuffmanCode *hc,int n) {char *p=chars; int i;strcpy(chars1,"");while(*p){i=1; while(hc[i].ch!=*p&&i<=n) i++;strcat(chars1,hc[i].chs); p++;}printf("the chars translate are:%s\n",chars1);return chars1;}3)译码。

void transcode(HuffmanTree ht,char *chars2,char*chars3) {int i=1,p; char *q=chars2;char *r=chars3;while(ht[i].parent!=0) i++;p=i;while(*q){while(ht[p].lchild!=0 && *q){if(*q=='0')p=ht[p].lchild;else p=ht[p].rchild;q++;}if(ht[p].lchild==0){*r=ht[p].ch;r++;}p=i;}*r='\0';printf("the chars are:");puts(chars3);}}void input(int *n,sw *w){int i;printf("input the mount of char:");scanf("%d",n);for(i=1;i<=*n;i++,w++){printf("input the %dth char and weight:",i);fflush(stdin);scanf("%c%d",&w->ch,&w->weight);4)主函数。

void main(){HTNode HT;HuffmanCode HC,*hc;HuffmanTree ht;huf *HUF,huf2;int n;sw w[40];char ch,inchar[500],outchar[1000];char *abc;char *p=inchar;input(&n,w);HUF=HuffmanCoding(&HT,&HC,w,n,&huf2);printf("input chars to translate:");fflush(stdin);//清除流,解决输入干扰ch=getchar();while(ch!='#'){*p=ch;p++;ch=getchar();}*p='\0';hc=HUF->HC;ht=HUF->HT;abc=convert(inchar,outchar,hc,n);transcode(ht,abc,outchar);}2.各模块的伪码算法1)节点结构体定义typedef structint weight;char ch;int parent,lchild,rchild;}HTNode,*HuffmanTree; //动态分配数组存贮哈夫曼树。

2)哈夫曼编码结构体定义。

typedef struct{char ch;char *chs;}HuffmanCode;3)根节点结构体定义。

typedef struct{char ch;int weight;}sw;4)哈夫曼树结构体定义。

typedef struct{HuffmanTree HT;HuffmanCode *HC;}huf;4)从HT[i-1]选择parent为零且weight最小的两个节点,分别编号为n1,n2. void select(HTNode * HT,int n,int *n1,int *n2){int i=1; int n3;while(HT[i].parent!=0)i++;*n1=i;i++;while(HT[i].parent!=0) i++;*n2=i;if(HT[*n1].weight<HT[*n2].weight){ n3=*n1;*n1=*n2;*n2=n3;}for(i++;i<=n;i++){if(HT[i].parent==0){ if(HT[i].weight<HT[*n1].weight)*n1=i;else if(HT[i].weight<HT[*n2].weight)*n2=i;}}}5)w存放n个字符的权值(均>0),构造哈夫曼树HT,并求出n个字符的哈夫曼编码HC.huf * HuffmanCoding(HuffmanTree HT,HuffmanCode *HC,sw *w,int n,huf *HUF){int m,i,s1,s2,start,c,f;HuffmanTree p;char *cd;if(n<=1) return 0;m=2*n-1;HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//零号单元未用。

相关主题