数据结构哈弗曼编码译码器.docx
- 文档编号:11413473
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:19
- 大小:85.93KB
数据结构哈弗曼编码译码器.docx
《数据结构哈弗曼编码译码器.docx》由会员分享,可在线阅读,更多相关《数据结构哈弗曼编码译码器.docx(19页珍藏版)》请在冰点文库上搜索。
数据结构哈弗曼编码译码器
软件学院
课程设计报告书
课程名称数据结构
设计题目哈弗曼编码译码器
专业班级软件09-5班
学号0920010508
姓名康文强
指导教师孙宁
2010年12月
1设计时间2
2设计目的2
3设计任务2
4设计内容3
4.11程序所要实现的功能3
4.12输入形式和输入值的范围3
4.13输出形式3
4.14测试数据3
4.2总体设计5
4.21抽象数据类型5
4.22主程序流程6
4.23各程序模块之间层次(调用)关系6
4.3详细介绍7
4.31数据类型的实现7
4.32主程序和其他主要函数的伪码7
4.33各函数之间的调用关系7
4.4测试与分析12
4.41测试12
4.42时间和空间复杂度分析和改进设想13
4.5附录(原代码及必要注释)13
5总结与展望18
参考文献20
成绩评定20
1设计时间
2010年12月27日到2010年12月31日
2设计目的
要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并上机调试的基本方法。
这对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。
3设计任务
从键盘输入一串电文字符能输出对应的哈夫曼编码。
同时,能翻译由哈夫曼编码生成的代码串,输出相应的电文字符串。
设计要求:
(1)从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树及哈夫曼编码。
(2)利用已经建好的哈夫曼树,对输入的字符串进行编码,输出编码序列。
(3)利用已建好的哈夫曼树对输入的二进制编码进行译码,并输出结果。
4设计内容
4.11程序所要实现的功能
从键盘输入一串电文字符能输出对应的哈夫曼编码。
同时,能翻译由哈夫曼编码生成的代码串,输出相应的电文字符串。
4.12输入形式和输入值的范围
输入形式及范围为a到z的字符和整型的常量。
4.13输出形式
输出形式为二进制形式的字符串。
4.14测试数据
正确的测试结果
错误的测试结果
4.2总体设计
4.21抽象数据类型
ADTHfmantree{
数据对象:
存储具有相同类型的数据
数据关系:
每个结点除了更结点外都有一个前驱和后继,最后的结成为叶子节点,没有去、后继。
基本操作create(h);创建一颗赫夫曼树
}
4.22主程序流程
①输需要编码的字符串
②键入每个字符的权值,并构建一颗赫夫曼树
③对输入的对应相应权值的字符进行编码
④对应编码再进行译码
4.23各程序模块之间层次(调用)关系
①voidSelect(HfmantreeHT,intn,int*s1,int*s2)
②intHuffmancoding(Hfmantree*HT,HuffmanCode*HC,int*w,intn,char*z)
③voidtranslate(HfmantreeHT,intn)
①
②
③
main
退出
4.3详细介绍
4.31数据类型的实现
构建赫夫曼树的结点
typedefstruct
{
charmail;
intweight;
intparent,lchild,rchild;
}HTnode,*Hfmantree;
typedefchar**HuffmanCode;
4.32主程序和其他主要函数的伪码
4.33各函数之间的调用关系
超找两个权值最小的结点
voidSelect(HfmantreeHT,intn,int*s1,int*s2)
{
inti,j;
for(i=1;i<=n;i++)
if(!
HT[i].parent){*s1=i;break;}
for(j=i+1;j<=n;j++)
if(!
HT[j].parent){*s2=j;break;}
for(i=1;i<=n;i++)
if((HT[*s1].weight>HT[i].weight)&&(!
HT[i].parent)&&(s2!
=&i))*s1=i;
for(j=1;j<=n;j++)
if((HT[*s2].weight>HT[j].weight)&&(!
HT[j].parent)&&(*s1!
=j))*s2=j;
}
对存在的一个赫夫曼树进行编码
Huffmancoding(Hfmantree*HT,HuffmanCode*HC,int*w,intn,char*z)
{
intm,i,s1,s2,c,start;
charf,*cd;
if(n<=1)return0;
m=2*n-1;
*HT=(Hfmantree)malloc((m+1)*sizeof(HTnode));
for(i=1;i<=n;i++)
{
(*HT)[i].weight=w[i-1];
(*HT)[i].mail=z[i-1];
(*HT)[i].parent=0;
(*HT)[i].lchild=0;
(*HT)[i].rchild=0;
}
for(i=n+1;i<=m;i++)
{
(*HT)[i].weight=0;
(*HT)[i].parent=0;
(*HT)[i].lchild=0;
(*HT)[i].rchild=0;
}
for(i=n+1;i<=m;++i)
{
Select(*HT,i-1,&s1,&s2);
(*HT)[s1].parent=i;(*HT)[s2].parent=i;
(*HT)[i].lchild=s1;(*HT)[i].rchild=s2;
(*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight;
}
*HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
cd=(char*)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;++i)
{
start=n-1;
for(c=i,f=(*HT)[i].parent;f!
=0;c=f,f=(*HT)[f].parent)
{if((*HT)[f].lchild==c)cd[--start]='0';
elsecd[--start]='1';
}
printf("%s\n",&cd[start]);
(*HC)[i]=(char*)malloc((n-start)*sizeof(char));
strcpy((*HC)[i],&cd[start]);
}
free(cd);
}
对赫夫曼树进行译码
translate(HfmantreeHT,intn)
{
intm,p,j;
int*q;
p=2*n-1;
/*for(i=0;i<=p;i++)
{
if(HT[i].parent==0)
{
s=i;
break;
}
}*/
printf("请输入想要输入数字的个数:
\n");
scanf("%d",&m);
q=(int*)malloc(m*sizeof(int));
printf("现在输入以01为内容的一串数:
\n");
for(j=0;j scanf("%d",&q[j]); for(j=0;j while(HT[p].lchild&&HT[p].rchild&&j {if(q[j])p=HT[p].rchild; elsep=HT[p].lchild; j++;} if(HT[p].lchild==0||HT[p].rchild==0) printf("%c",HT[p].mail); elseprintf("error"); p=2*n-1; printf("\n"); } } 4.4测试与分析 4.41测试 正确的测试 错误的测试: 4.42时间和空间复杂度分析和改进设想 4.5附录(原代码及必要注释) #include"string.h" #include"malloc.h" #include"stdio.h" #include typedefstruct { charmail; intweight; intparent,lchild,rchild; }HTnode,*Hfmantree; typedefchar**HuffmanCode; voidSelect(HfmantreeHT,intn,int*s1,int*s2) { inti,j; for(i=1;i<=n;i++) if(! HT[i].parent){*s1=i;break;} for(j=i+1;j<=n;j++) if(! HT[j].parent){*s2=j;break;} for(i=1;i<=n;i++) if((HT[*s1].weight>HT[i].weight)&&(! HT[i].parent)&&(s2! =&i))*s1=i; for(j=1;j<=n;j++) if((HT[*s2].weight>HT[j].weight)&&(! HT[j].parent)&&(*s1! =j))*s2=j; } intHuffmancoding(Hfmantree*HT,HuffmanCode*HC,int*w,intn,char*z) { intm,i,s1,s2,c,start; charf,*cd; if(n<=1)return0; m=2*n-1; *HT=(Hfmantree)malloc((m+1)*sizeof(HTnode)); for(i=1;i<=n;i++) { (*HT)[i].weight=w[i-1]; (*HT)[i].mail=z[i-1]; (*HT)[i].parent=0; (*HT)[i].lchild=0; (*HT)[i].rchild=0; } for(i=n+1;i<=m;i++) { (*HT)[i].weight=0; (*HT)[i].parent=0; (*HT)[i].lchild=0; (*HT)[i].rchild=0; } for(i=n+1;i<=m;++i) { Select(*HT,i-1,&s1,&s2); (*HT)[s1].parent=i;(*HT)[s2].parent=i; (*HT)[i].lchild=s1;(*HT)[i].rchild=s2; (*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight; } *HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); cd=(char*)malloc(n*sizeof(char)); cd[n-1]='\0'; for(i=1;i<=n;++i) { start=n-1; for(c=i,f=(*HT)[i].parent;f! =0;c=f,f=(*HT)[f].parent) {if((*HT)[f].lchild==c)cd[--start]='0'; elsecd[--start]='1'; } printf("%s\n",&cd[start]); (*HC)[i]=(char*)malloc((n-start)*sizeof(char)); strcpy((*HC)[i],&cd[start]); } free(cd); } voidtranslate(HfmantreeHT,intn) { intm,p,j; int*q; p=2*n-1; /*for(i=0;i<=p;i++) { if(HT[i].parent==0) { s=i; break; } }*/ printf("请输入想要输入数字的个数: \n"); scanf("%d",&m); q=(int*)malloc(m*sizeof(int)); printf("现在输入以01为内容的一串数: \n"); for(j=0;j scanf("%d",&q[j]); for(j=0;j while(HT[p].lchild&&HT[p].rchild&&j {if(q[j])p=HT[p].rchild; elsep=HT[p].lchild; j++;} if(HT[p].lchild==0||HT[p].rchild==0) printf("%c",HT[p].mail); elseprintf("error"); p=2*n-1; J--; printf("\n"); } } voidmain() { inti,n,*w; char*z; HuffmanCodeHC; HfmantreeHT; printf("请输入节点的个数n的值: \n"); scanf("%d",&n); w=(int*)malloc(n*sizeof(int)); z=(char*)malloc(n*sizeof(char)); /*HC=(HuffmanCode)malloc(n*sizeof(char*));*/ printf("请依次输入字符输入和它的权值: \n"); printf("现在请输入字符: \n"); for(i=0;i scanf("%s",&z[i]); printf("请依次对应的输入%d个结点的权值\n",n); for(i=0;i scanf("%d",&w[i]); Huffmancoding(&HT,&HC,w,n,z); printf("现在输出各个字符的哈弗曼编码: \n"); for(i=1;i<=n;i++) printf("%c%s\n",z[i-1],HC[i]); translate(HT,n); } 5总结与展望 通过这次课程设计我深刻的理解了赫夫曼编码的算法,同时理解了数据结构中思想的严谨性和准确性,在这次设计过程中让我找到了自己在设计过程中的缺点,我意识到自己当时学明白并不代表自己就真正的会,自己在看书是看明白了不一定就能在计算机上运行,例如当输入为%c时候如果一个一个的输入程序会把回车也当做一个字符所以应该用%s进行输入。 在这就是在每次程序中出现的老问题,在函数调用时如果传值和传址弄混那么在函数调用过程中就会出现传不回地址或者传回的值为乱码。 在以后的每个程序中我一定会尽自己最大努力,在每个程序中我都细心地去敲入每个字符,函数调用过程中先想明白在往上面写。 我一定会继续努力,不辜负父母和老师对我的期望! 参考文献 [1]严蔚敏,吴伟民,清华大学计算机系列教材,《数据结构(C语言版)》,清华大学出版社,2007; [2]谭浩强,C程序设计—3版,清华大学出版社,2005(2007重印); [3] 成绩评定 成绩教师签字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 哈弗曼编码译码器 哈弗曼 编码 译码器