数据结构课程设计报告前缀编码问题.docx
- 文档编号:11247409
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:14
- 大小:149.03KB
数据结构课程设计报告前缀编码问题.docx
《数据结构课程设计报告前缀编码问题.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告前缀编码问题.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告前缀编码问题
数据结构
课程设计报告
题目:
专业:
班级:
学号:
姓名:
指导老师:
时间:
一、课程设计题目及所涉及知识点
设计题目是:
“前缀编码问题”。
所涉及的知识点主要是:
本课程设计利用二叉树来设计二进制的前缀编码,前缀编码顾名思义就是任意一字符的编码都不是另一个字符的编码的前缀,主要难点在于如何根据输入的字符和使用频度构造出最优二叉树,并根据构造的最优二叉树输出每个字符的编码,这主要设计到对每个字符的权值进行冒泡排序找出最小的两个权值作为左右孩子结点,以他们的和作为父母结点,并把父母结点作为新的权值数重新排序,最终构造出完整的哈夫曼树,以根的左右路径分别代表值“0”与“1”连续存储,得到每个字符的编码。
二、课程设计思路及算法描述
设计思路:
通过构造哈夫曼树的结构体定义一个哈夫曼树组,对用户输入的字符以及使用频率进行存储和初始化,然后对字符进行编译处理,通过构造哈夫曼树编译出每个字符的编码,然后对每个编码进行存储并与字符相关联,并输出每个字符以及对应的编码。
最终根据用户选择的功能进行编码和译码操作。
问题一:
哈夫曼树的表示。
设计哈夫曼树的结构体,其中包含使用频率(权重)、左孩子、右孩子、双亲和要编码的字符。
用这个结构体定义个一个哈夫曼数组。
哈夫曼结构体定义如下:
typedefstruct
{
intweight;
intlchild;
intrchild;
intparent;
charkey;
}htnode;
typedefhtnodehfmt[MAXLEN];
问题二:
对输入字符进行编码。
初始化哈夫曼树,每个节点的孩子及双亲默认值为-1,使用频率为0。
根据用户选择输入字符个数n,以及n个字符和n个权值,构造出哈夫曼树,并显示出每个字符及对应编码。
1.voidcreathfmt(hfmtt)//创建哈夫曼树的函数
2.voidselectmin(hfmtt,inti,int*p1,int*p2)//选出两个最小的字符权值
3.voidphfmnode(hfmtt)//对字符进行初始编码
问题三:
对用户输入的电文进行编码。
用户输入一连串原本输入的字符构成电文,电文长度在1000字符以内,由程序进行编码转换。
并输出转换后的编码。
voidencoding(hfmtt)//对用户输入的电文进行编码
{
charr[1000];//用来存储输入的字符串
inti,j;
printf("\n请输入需要编码的字符:
");
gets(r);
printf("编码结果为:
");
for(j=0;r[j]!
='\0';j++)
for(i=0;i if(r[j]==t[i].key) hfmtpath(t,i,j); printf("\n"); } 问题四: 对用户输入的密文进行译码。 用户输入一连串二进制代码字符构成密文,电文长度在100个二进制代码以内,由程序进行编码转换。 并输出转换后的译码。 voiddecoding(hfmtt)//对用户输入的密文进行译码 { charr[100]; inti,j,len; j=2*n-2;//j初始从树的根节点开始 printf("\n请输入需要译码的字符串: "); gets(r); len=strlen(r); printf("译码的结果是: "); for(i=0;i { if(r[i]=='0') { j=t[j].lchild; if(t[j].lchild==-1) { printf("%c",t[j].key); j=2*n-2; } } elseif(r[i]=='1') { j=t[j].rchild; if(t[j].rchild==-1) { printf("%c",t[j].key); j=2*n-2; } } } printf("\n"); } 三、课程设计中遇到的难点及解决办法 在程序设计中遇到的问题主要是如何根据输入的字符频率构造哈夫曼树,这其中涉及到对哈夫曼树的存储,以及根据树的左孩子路径为“0”右孩子路径“1”对字符进行二级制编码,在参考课文和网络资源后进行整理和加工,设计出了构造哈夫曼树的程序。 由于事先不知道用户要输入几个字符,所以无法判断最终二进制编码的长度,通过定义一个比较大的存储空间存储编码。 在对每个字符构造出编码后根据用户选择进行编码和译码,这其中遇到的难点主要是根据用户输入的信息进行翻译,特别是译码过程,主要难点的解决时上网XX和询问老师解决的。 4、总结 通过这次课程设计,我对前缀编码问题有了深刻的认识,对哈夫曼树的优越性也有了深刻的了解,利用哈夫曼编码可以极大的缩短编码长度,提高信息的传输时间,在社会的实际应用时很广泛的,同时通过程序设计中对哈夫曼树的构造,对我的编程思想有了很大的提高,我对数据结构也有了更好的掌握,虽然距离完全的掌握每一个功能操作还有一定的差距,但是我相信通过不断地学习和努力,我一定能做的更好更完善。 5、附录—主要源程序代码及运行结果 #include #include #include #defineMAXLEN100 typedefstruct { intweight; intlchild; intrchild; intparent; charkey; }htnode; typedefhtnodehfmt[MAXLEN]; intn; voidselectmin(hfmtt,inti,int*p1,int*p2)//选中两个权值最小的函数 { longmin1=999999; longmin2=999999; intj; for(j=0;j<=i;j++)//选择最小权值字符的下标返回 if(t[j].parent==-1) if(min1>t[j].weight) { min1=t[j].weight; *p1=j; } for(j=0;j<=i;j++)//选择次小权值字符的下标还回 if(t[j].parent==-1) if(min2>t[j].weight&&j! =(*p1)) { min2=t[j].weight; *p2=j; } } voidcreathfmt(hfmtt)//创建哈夫曼树的函数 { inti,w,p1,p2; chark;//k表示获取的字符 printf("\n"); printf("------------------------------------------------\n"); printf("*********************输入区*********************\n"); printf("\n请输入字符个数: "); scanf("%d",&n); getchar(); for(i=0;i<2*n-1;i++)//对结构体进行初始化 { t[i].weight=0; t[i].lchild=-1; t[i].rchild=-1; t[i].parent=-1; } printf("\n"); for(i=0;i { printf("请输入第%d个字符: ",i+1); scanf("%c",&k); getchar(); t[i].key=k; printf("请输入第%d个字符的权值: ",i+1); scanf("%d",&w); getchar(); t[i].weight=w; printf("\n"); } for(i=n;i<2*n-1;i++) { selectmin(t,i-1,&p1,&p2); t[p1].parent=i; t[p2].parent=i; t[i].lchild=p1; t[i].rchild=p2; t[i].weight=t[p1].weight+t[p2].weight; } } voidhfmtpath(hfmtt,inti,intj)//编码的重要哈夫曼树路径递归算法 { inta,b; a=i; b=j=t[i].parent; if(t[j].parent! =-1) { i=j; hfmtpath(t,i,j); } if(t[b].lchild==a) printf("0"); else printf("1"); } voidphfmnode(hfmtt)//对字符进行初始编码 { inti,j; printf("------------------------------------------------\n"); printf("*******************哈夫曼编码*******************\n"); for(i=0;i { j=0; printf("\n"); printf("\t\t%c\t\t",t[i].key,t[i].weight); hfmtpath(t,i,j); } } voidencoding(hfmtt)//对用户输入的电文进行编码 { charr[1000];//用来存储输入的字符串 inti,j; printf("\n请输入需要编码的字符: "); gets(r); printf("编码结果为: "); for(j=0;r[j]! ='\0';j++) for(i=0;i if(r[j]==t[i].key) hfmtpath(t,i,j); printf("\n"); } voiddecoding(hfmtt)//对用户输入的密文进行译码 { charr[100]; inti,j,len; j=2*n-2;//j初始从树的根节点开始 printf("\n请输入需要译码的字符串: "); gets(r); len=strlen(r); printf("译码的结果是: "); for(i=0;i { if(r[i]=='0') { j=t[j].lchild; if(t[j].lchild==-1) { printf("%c",t[j].key); j=2*n-2; } } elseif(r[i]=='1') { j=t[j].rchild; if(t[j].rchild==-1) { printf("%c",t[j].key); j=2*n-2; } } } printf("\n"); } voidmain() { hfmtht; charflag; printf("------------------------------------------------\n"); printf("**********说明**********\n"); printf("*11级数据结构课程设计*\n"); printf("*哈夫曼编码*\n"); printf("*科学与技术专业邵帅*\n"); printf("************************\n"); creathfmt(ht);//创建哈夫曼树的函数 phfmnode(ht);//对字符进行初始编码 printf("\n------------------------------------------------\n"); do{ printf("********************功能选择********************\n"); printf("【1】编码\t【2】译码\t【0】退出\n"); printf("您的选择: "); flag=getchar(); getchar(); if(flag=='1') encoding(ht); elseif(flag=='2') decoding(ht); elseif(flag=='0') return; else printf("您的输入有误,请重新输入。 \n"); }while(flag! ='0'); printf("\n"); } 运行结果: 六、指导老师评语及成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 前缀 编码 问题