第一范文网 - 专业文章范例文档资料分享平台

哈夫曼编码课程设计报告 (3)

来源:用户分享 时间:2020-06-17 本文由小小的萌 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

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下载服务。

哈夫曼编码课程设计报告 (3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/1082480.html(转载请注明文章来源)
热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top