3.main函数
开始 调用CreateHT函数, 构造haffman树 调用CreateHCode函数, 生成haffman编码 输入str1[]; 存在相应代码串 N Y 结束 译码 Y flag=0 N 图4.main函数流程图
第5页 共21页
4. CreateHCode函数
开始 hc.start=n;c=i; f=ht[i].parent; ht[f].lchild=c Y ht[f].cd[hc.start--]=’0’; N ht[f].cd[hc.start--]=’1’; Y f!=-1 N hc.start++; hcd[i]=hc; i 第6页 共21页 3.各模块的类C码算法 1)编码模块: 首先通过键盘输入需要键盘的字符串,调用countstr()函数统计并储存字符频度,再调用函数: void CreateHT(HTNode ht[],int n) //构造哈弗曼树 { int i,j,k,lnode,rnode; double min1,min2; //分别存放lnode和rnode的两个结点位置 使所有结点的相关域置-1 for(i=n;i<2*n-1;i++) { } } 再调用: void CreateHCode(HTNode ht[],HCode hcd[],int n) { for(i=0;i hc.start=n; c=i; f=ht[i].parent; 若ht[i]为ht[f]的左孩子结点,则 hc.cd[hc.start--]='0'; 先寻找权值最小结点,使其成为左右孩子结点; 再求出权值为左右孩子结点权值之和的h[i]结点; 使ht[i]作为双亲结点; 若ht[i]为ht[f]的右孩子结点,则 hc.cd[hc.start--]='1'; 再对ht[f]进行同样的判断,直至f=-1 hc.start++; 第7页 共21页 } } hcd[i]=hc; 2)译码模块: 先通过键盘输入哈夫曼编码代码串,再调用: int ReadCode(char str1[],HCode hcd[],HTNode ht[],int MAX,int n) //译码函数 { int i,j,m=0,k; int flag=1; //flag为1则哈弗曼编码 输入合法 char temp[30]=\ for(i=0;str1[i]!='\\0';i++,m++) //进行译码 { } 第8页 共21页 temp[m]=str1[i]; for(j=0;j 若找到对应编码 { printf(\for(k=0;k<30;k++) temp[k]='\\0'; m=-1; 终止循环; } 四. 调试分析以及设计体会 1.测试数据: 准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果: 输入: 图6.编码输入演示图 输出: 图7.编码输出演示图 正确输入哈夫曼编码代号: 图8.正确译码输入演示图 输出: 图9.正确输入译码译码结果输出演示图 第9页 共21页