第五组程序设计总结.doc

实验三 哈夫曼编码/译码系统(树应用) 一、实验目的 1. 帮助读者复习C++语言程序设计中的知识。 2.哈夫曼树的建立,哈夫曼编码的生成,对编码信息的翻译的熟悉和运用。 [需求分析] 利用哈夫曼编码进行通信,可以压缩通信的数据量,提高传输效率,缩短信息的传输时间,还有一定的保密性。现在要求编写一程序模拟传输过程,实现在发送前将要发送的字符信息进行编码,然后进行发送,接收后将传来的数据进行译码,即将信息还原成发送前的字符信息。 二、实验内容和要求 [问题要求] 利用哈夫曼编码进行通信,可以压缩通信的数据量,提高传输效率,缩短信息的传输时间,还有一定的保密性。现在要求编写一程序模拟传输过程,实现在发送前将要发送的字符信息进行编码,然后进行发送,接收后将传来的数据进行译码,即将信息还原成发送前的字符信息。 [问题分析] 在本例中设置发送者和接受者两个功能,发送者的功能包括:输入待传送的字符信息;统计字符信息中出现的字符种类数和各字符出现的次数(频率);根据字符的种类数和各自出现的次数建立哈夫曼树;利用以上哈夫曼树求出各字符的哈夫曼编码;将字符信息转换成对应的编码信息进行传送。接受者的功能包括:接收发送者传送来的编码信息;利用上述哈夫曼树对编码信息进行翻译,即将编码信息还原成发送前的字符信息。本实验首先从文件中读取数据,然后分析数据对不同的元素依次存入一字符数组并统计其出现的次数并当做其权值,然后根据这些信息建立哈弗曼树,并对各个字符进行哈弗曼编码然后根据各个字符的编码对所有输入的一组字符进行哈弗曼编码。译码是根据哈弗曼树和接收到的一组编码进行译码操作。译码也就是对哈弗曼树的遍历 编码 五、测试结果 程序符合算法要求,能正确编码 #includeiostream.h #includestdio.h #includestdlib.h #includestring.h #includefstream.h typedef struct{ //哈夫曼树的结构体 char ch; int weight; //权值 int parent,lchild,rchild; }htnode,*hfmtree; typedef char **hfmcode; void Select(hfmtree HT,int a,int *p1,int *p2) //Select函数,选出HT树到a为止,权值最小且parent为0的2个节点 { int i,j,x,y; for(j=1;j=a;++j){ if(HT[j].parent==0){ x=j; break; } } for(i=j+1;i=a;++i){ if(HT[i].weightHT[x].weightHT[i].parent==0){ x=i; //选出最小的节点 } } for(j=1;j=a;++j) { if(HT[j].parent==0x!=j) { y=j; break; } } for(i=j+1;i=a;++i) { if(HT[i].weightHT[y].weightHT[i].parent==0x!=i) { y=i; //选出次小的节点 } } if(xy){ *p1=y; *p2=x; } else { *p1=x; *p2=y; } } void hfmcoding(hfmtree HT,hfmcode HC,int n) //构建哈夫曼树HT,并求出n个字符的哈夫曼编码HC { int i,start,c,f,m,w; int p1,p2; char *cd,z; if(n=1){ return; } m=2*n-1; HT=(hfmtree)malloc((m+1)*sizeof(htnode)); for(i=1;i=n;++i) //初始化n个叶子结点 { printf(请输入第%d字符信息和权值:,i); scanf(%c%d,z,w); while(getchar()!=\n) { continue; } HT[i].ch=z; HT[i].weight=w; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } for(;i=m;++i) //初始化其余的结点 { HT[i].ch=0; HT[i].weight=0; HT[i

文档评论(0)

1亿VIP精品文档

相关文档