4 系统实现
各模块关键代码及算法的解释: ① 主调函数
代码解释:这是main函数里的各个函数调用情况。 fileopen(string); //从硬盘中读取文件
num=tongji(string,cishu,str); //统计字符种类及各类字符出现
的频率
Create_huffmanTree(HT,HC,cishu,str);//建立哈夫曼树 Huffman_bianma(HT,HC); //生成哈夫曼编码
② 建立HuffmanTree
代码解释:该函数为在ht[1....k]中选择parent为0且权值最小的两个根结点的算法,其序号为s1和s2。
void select_min(HuffmanTree T,int k,int &x1,int &x2) {
int i,j; int min1=1000;
for(i=1;i<=k;i++)
if(T[i].weight x1=j;min1=1000; for (i=1;i<=k;i++) if(T[i].weight j=i; min1=T[i].weight; 10 j=i; min1=T[i].weight; } } x2=j; 代码解释:下面函数用来统计字符串中各种字母的个数以及字符的种类。当字符在A和Z之间时即被计数,并用str[j]保存字母到数组中,用cnt[j]统计每种字符个数。j返回总共读取的字符数目。 int tongji(char *s,int cishu[],char str[]) { int i,j,k; char *p; int t[27]; for(i=1;i<=26;i++) t[i]=0; for(p=s; *p!='\\0';p++) { } for(i=1,j=0;i<=26;++i) } if(t[i]!=0 ) { return j; j++; str[j]=i+64; cishu[j]=t[i]; if(*p>='A'&&*p<='Z') k=*p-64; t[k]++; 11 代码解释:下面函数用来构造哈夫曼树HT。首先初始化哈夫曼树,然后输入前面统计的各结点的权值,用for循环来构造哈夫曼树。 void Create_huffmanTree(HuffmanTree ht,HuffmanCode hc,int cishu[],char str[]) { //生成哈夫曼树HT int i,s1,s2; for(i=0;i<2*num-1;i++) { } for(i=1;i<=num;i++) //输入num个叶结点的权值 ht[i].weight=cishu[i]; ht[i].left=0; ht[i].right=0; ht[i].parent=0; ht[i].weight=0; for(i=num+1;i<=2*num-1;i++) { //选择parent为0且权值最小的两个根结点,其序号为s1和s2,i 为双亲 } } for(i=0;i<=num;i++) hc[i].ch=str[i]; //字符的种类 select_min(ht,i-1,s1,s2); ht[s1].parent=i;ht[s2].parent=i; ht[i].left=s1; ht[i].right=s2; ht[i].weight=ht[s1].weight+ht[s2].weight; i=1;while(i<=num) printf(\字符%c次数:?\\n\ 12 ③ 生成Huffman编码并写入文件 代码解释:根据哈夫曼树T求哈夫曼编码H。 void Huffman_bianma(HuffmanTree T,HuffmanCode H) //根据哈夫曼树T求哈夫曼编码H { int child,parent,i; //child和parent分别指示 t中孩子和双亲 符 for(i=1;i<=num;++i) { while((parent=T[child].parent)>0) //直至t[child]是树根为止 { //若t[child]是t[parent]的左孩子,start=num; //初始位置 child=i; //从叶子结点到根结点进行遍历 char code[n]; //存放编码 int start; //指示码在code中的起始位置 code[num]='\\0'; //最后一位(第num个)放上串结束 则生成0;否则生成1 } } } strcpy(H[i].co,&code[start]); H[i].len=num-start; if(T[parent].left==child) code[--start]='0'; else code[--start]='1'; child=parent; 13 代码解释:对str所代表的字符串进行编码并写入文件。将翻译的二进制码写入文本文件。 void coding(HuffmanCode hc ,char *str) { //对str所代表的字符串进行编码 并写入文件 } int i,j; FILE *fp; fp=fopen(\while(*str) { for(i=1;i<=num;i++) if(hc[i]. ch==*str){ } str++; for(j=0;j<=hc[i].len;j++) fputc(hc[i].co[j],fp); break; }fclose(fp); 14 搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新经管营销哈夫曼编码课程设计报告 (3)全文阅读和word下载服务。
相关推荐: