欢迎来到天天文库
浏览记录
ID:47475753
大小:434.54 KB
页数:29页
时间:2020-01-11
《哈夫曼树应用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一.具体任务题目:哈夫曼树应用功能:1.从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上;2.中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中,并输出结果。同时将此字符形式的编码文件写入文件CodePrint中。3.利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中,并输出结果。二.软件环境Code::Blocks10.05三
2、.算法设计思想1.建立哈夫曼树函数voidHuffTree(HNodeHuff[],intn)//生成哈夫曼树{FILE*fp;chard;inti,j,w,m1,m2,x1,x2;for(i=0;i<2*n-1;i++)//对数组Huff初始化{Huff[i].ch='';Huff[i].weight=0;Huff[i].parent=-1;Huff[i].lchild=-1;Huff[i].rchild=-1;}printf("输入%d个字符及它的权值:",n);//读入数据getchar()
3、;for(i=0;i4、1和x2{if(Huff[j].parent==-1&&Huff[j].weight5、].weight;Huff[n+i].lchild=x1;Huff[n+i].rchild=x2;}2.对哈夫曼树进行编码voidHuffmanCode(HNodeHuff[],intn)//生成哈夫曼编码{FILE*fw;HCodeHuffCode[MAXSIZE/2],cd;//MAXSIZE/2为叶结点的最大个数inti,j,c,p;for(i=0;i6、;c=i;p=Huff[c].parent;while(p!=-1){if(Huff[p].lchild==c)cd.bit[cd.start]=0;elsecd.bit[cd.start]=1;cd.start--;c=p;p=Huff[c].parent;}for(j=cd.start+1;j7、3.根据哈夫曼编码进行译码voiddecode(HNodeHuff[],intn)//依次读入电文,根据哈夫曼树译码{FILE*fs;inti,j=0;charb[MAXSIZE];i=2*n-2;//从根结点开始往下搜索printf("【输入电文,并进行译码】");getchar();printf("输入发送的编码(以'2'为结束标志):");gets(b);printf("译码后的字符为:");while(b[j]!='2'){if(b[j]=='0')i=Huff[i].lchild8、;//走向左孩子elsei=Huff[i].rchild;//走向右孩子if(Huff[i].lchild==-1)//tree[i]是叶结点{printf("%c",Huff[i].ch);i=2*n-2;//回到根结点}j++;}printf("");if(Huff[i].lchild!=-1&&b[j]!='2')//电文读完,但尚未到叶子结点printf("ERROR");//输入电文4.菜单调用voidmenu(){printf("
4、1和x2{if(Huff[j].parent==-1&&Huff[j].weight5、].weight;Huff[n+i].lchild=x1;Huff[n+i].rchild=x2;}2.对哈夫曼树进行编码voidHuffmanCode(HNodeHuff[],intn)//生成哈夫曼编码{FILE*fw;HCodeHuffCode[MAXSIZE/2],cd;//MAXSIZE/2为叶结点的最大个数inti,j,c,p;for(i=0;i6、;c=i;p=Huff[c].parent;while(p!=-1){if(Huff[p].lchild==c)cd.bit[cd.start]=0;elsecd.bit[cd.start]=1;cd.start--;c=p;p=Huff[c].parent;}for(j=cd.start+1;j7、3.根据哈夫曼编码进行译码voiddecode(HNodeHuff[],intn)//依次读入电文,根据哈夫曼树译码{FILE*fs;inti,j=0;charb[MAXSIZE];i=2*n-2;//从根结点开始往下搜索printf("【输入电文,并进行译码】");getchar();printf("输入发送的编码(以'2'为结束标志):");gets(b);printf("译码后的字符为:");while(b[j]!='2'){if(b[j]=='0')i=Huff[i].lchild8、;//走向左孩子elsei=Huff[i].rchild;//走向右孩子if(Huff[i].lchild==-1)//tree[i]是叶结点{printf("%c",Huff[i].ch);i=2*n-2;//回到根结点}j++;}printf("");if(Huff[i].lchild!=-1&&b[j]!='2')//电文读完,但尚未到叶子结点printf("ERROR");//输入电文4.菜单调用voidmenu(){printf("
5、].weight;Huff[n+i].lchild=x1;Huff[n+i].rchild=x2;}2.对哈夫曼树进行编码voidHuffmanCode(HNodeHuff[],intn)//生成哈夫曼编码{FILE*fw;HCodeHuffCode[MAXSIZE/2],cd;//MAXSIZE/2为叶结点的最大个数inti,j,c,p;for(i=0;i6、;c=i;p=Huff[c].parent;while(p!=-1){if(Huff[p].lchild==c)cd.bit[cd.start]=0;elsecd.bit[cd.start]=1;cd.start--;c=p;p=Huff[c].parent;}for(j=cd.start+1;j7、3.根据哈夫曼编码进行译码voiddecode(HNodeHuff[],intn)//依次读入电文,根据哈夫曼树译码{FILE*fs;inti,j=0;charb[MAXSIZE];i=2*n-2;//从根结点开始往下搜索printf("【输入电文,并进行译码】");getchar();printf("输入发送的编码(以'2'为结束标志):");gets(b);printf("译码后的字符为:");while(b[j]!='2'){if(b[j]=='0')i=Huff[i].lchild8、;//走向左孩子elsei=Huff[i].rchild;//走向右孩子if(Huff[i].lchild==-1)//tree[i]是叶结点{printf("%c",Huff[i].ch);i=2*n-2;//回到根结点}j++;}printf("");if(Huff[i].lchild!=-1&&b[j]!='2')//电文读完,但尚未到叶子结点printf("ERROR");//输入电文4.菜单调用voidmenu(){printf("
6、;c=i;p=Huff[c].parent;while(p!=-1){if(Huff[p].lchild==c)cd.bit[cd.start]=0;elsecd.bit[cd.start]=1;cd.start--;c=p;p=Huff[c].parent;}for(j=cd.start+1;j7、3.根据哈夫曼编码进行译码voiddecode(HNodeHuff[],intn)//依次读入电文,根据哈夫曼树译码{FILE*fs;inti,j=0;charb[MAXSIZE];i=2*n-2;//从根结点开始往下搜索printf("【输入电文,并进行译码】");getchar();printf("输入发送的编码(以'2'为结束标志):");gets(b);printf("译码后的字符为:");while(b[j]!='2'){if(b[j]=='0')i=Huff[i].lchild8、;//走向左孩子elsei=Huff[i].rchild;//走向右孩子if(Huff[i].lchild==-1)//tree[i]是叶结点{printf("%c",Huff[i].ch);i=2*n-2;//回到根结点}j++;}printf("");if(Huff[i].lchild!=-1&&b[j]!='2')//电文读完,但尚未到叶子结点printf("ERROR");//输入电文4.菜单调用voidmenu(){printf("
7、3.根据哈夫曼编码进行译码voiddecode(HNodeHuff[],intn)//依次读入电文,根据哈夫曼树译码{FILE*fs;inti,j=0;charb[MAXSIZE];i=2*n-2;//从根结点开始往下搜索printf("【输入电文,并进行译码】");getchar();printf("输入发送的编码(以'2'为结束标志):");gets(b);printf("译码后的字符为:");while(b[j]!='2'){if(b[j]=='0')i=Huff[i].lchild
8、;//走向左孩子elsei=Huff[i].rchild;//走向右孩子if(Huff[i].lchild==-1)//tree[i]是叶结点{printf("%c",Huff[i].ch);i=2*n-2;//回到根结点}j++;}printf("");if(Huff[i].lchild!=-1&&b[j]!='2')//电文读完,但尚未到叶子结点printf("ERROR");//输入电文4.菜单调用voidmenu(){printf("
此文档下载收益归作者所有