数据结构课程设计哈夫曼编码.docx
《数据结构课程设计哈夫曼编码.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计哈夫曼编码.docx(12页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计哈夫曼编码.docx](https://file1.bdocx.com/fileroot1/2022-11/29/0e2ee609-2ea7-4584-86ba-4bd166f55825/0e2ee609-2ea7-4584-86ba-4bd166f558251.gif)
数据结构课程设计哈夫曼编码
程序设计(大作业)报告
课程名称:
数据结构课程设计
设计题目:
哈夫曼编码器
院系:
信息技术学院
班级:
计算机科学与技术2班
设计者:
郭彩丁
学号:
201011010205
指导教师:
王亚宁
设计时间:
2012.1.9-2012.1.11
昆明学院
昆明学院课程设计(大作业)任务书
姓名:
郭彩丁院系:
信息技术学院
专业:
计算机科学与技术专业学号:
201011010205
任务起止日期:
2012.1.9-2012.1.11
课程设计题目:
哈夫曼编码器
课程设计要求:
(1)初始化:
键盘输入n个字符和n个权值,建立哈夫曼树
(2)编码:
利用建好的huffman树生成huffman编码
(3)输出编码
(4)字符和频度如下:
①字符:
空格ABCDEFGHIJKLMNOPQ
频度:
18664132232103211547571232205763151
②字符:
RSTUVWXYZ
频度:
48518023818116
工作计划及安排
(1)在上机之前选题
(2)选择合适的数据结构
(3)结点结构的设计
(4)算法设计与分析
(5)程序设计、实现、调试
(6)提交课程设计报告
指导教师签字
年月日
课程设计(大作业)成绩
学号:
201011010205姓名:
郭彩丁指导教师:
王亚宁老师
课程设计题目:
哈夫曼编码器
总结:
通过此次的课程设计使我认识了哈夫曼树的建立与应用,复习了数据结构中的树的存储结构,怎样构造哈夫曼树以及用哈夫曼树进行编码。
学习数据结构能使我们为其它课程打好基础,而课程设计作为数据结构中一个重要环节能更好的使我们加深对它的了解。
指导教师评语:
成绩:
填表时间:
指导教师签名:
目录
程序设计(大作业)报告1
昆明学院课程设计(大作业)任务书2
1.问题描述5
2.基本要求5
3.数据结构5
4.总体设计5
5.详细设计6
5.1程序流程图6
5.2初始化哈夫曼树7
5.3输入权值函数7
5.4选择根结点,存放权值最小和次小序号7
5.5构造哈夫曼树7
5.6根据哈夫曼树求哈夫曼编码7
6.测试与调试7
6.1程序步骤演示7
6.1.1输入各字符的权值7
6.1.2输入字符8
6.1.3得到哈夫曼编码8
6.2程序测试结果8
7.源程序清单10
8.实验心得13
1.问题描述
构造一棵哈夫曼树,根据所需输入的字符数目,分别输入字符的频度和字符,得到它们相应的编码,也就是设计一个哈夫曼编码器。
2.基本要求
以字符的频度为权值,建立哈夫曼树,求哈夫曼编码。
根据字符及权值得到其相应的编码。
3.数据结构
typedefstruct
{intweight;/*结点的权值*/
intlchild,rchild,parent;/*左、右孩子及双亲的下标*/
}htnode;
typedefhtnodehuffmantree[m+1];/*huffmantree是结构数组类型,其0号单元不用,存储哈夫曼树*/
typedefstruct
{charch;/*存储字符*/
charcode[n+1];/*存放编码位串*/
}codenode;
typedefcodenodehuffmancode[n+1];/*huffmancode是结构数组类型,其0号单元不用,存储哈夫曼编码*/
4.总体设计
功能模块划分
voidmain()//主函数
voidinithuffmantree(huffmantreeht)//初始化哈夫曼树函数inithuffmantree()
voidinputweight(huffmantreeht)//输入权值函数
voidselectmin(huffmantreeht,inti,int*p1,int*p2)
voidcreatehuffmantree(huffmantreeht)//构造huffman树,ht[m]为其根结
voidhuffmancodes(huffmantreeht,huffmancodehcd)/*根据huffman树ht求huffman编
5.详细设计
5.1程序流程图
N
Y
5.2初始化哈夫曼树
voidinithuffmantree(huffmantreeht)
5.3输入权值函数
voidinputweight(huffmantreeht)
5.4选择根结点,存放权值最小和次小序号
voidselectmin(huffmantreeht,inti,int*p1,int*p2)
5.5构造哈夫曼树
voidcreatehuffmantree(huffmantreeht)
5.6根据哈夫曼树求哈夫曼编码
voidhuffmancodes(huffmantreeht,huffmancodehcd)
6.测试与调试
6.1程序步骤演示
6.1.1输入各字符的权值
6.1.2输入字符
6.1.3得到哈夫曼编码
6.2程序测试结果
字符:
RSTUVWXYZ
频度:
4851802381811610
字符:
ABCDEFGHIJKLMNOPQ
频度:
18664132232103211547571232205763151
7.源程序清单
#include
#include//用到系统标准输出函数的
#include
#include//用到像getch()这种键盘输入函数
/*Huffman树的存储结构*/
#definen9/*叶子数目根据需要设定*/
#definem2*n-1/*Huffman树中结点总数*/
/*Huffman树的存储结构*/
typedefstruct/*结构体定义*/
{intweight;/*结点的权值*/
intlchild,rchild,parent;/*左、右孩子及双亲的下标*/
}htnode;/*哈夫曼树结点类型*/
typedefhtnodehuffmantree[m+1];/*huffmantree是结构数组类型,其0号单元不用,存储哈夫曼树*/
typedefstruct
{charch;/*存储字符*/
charcode[n+1];/*存放编码位串*/
}codenode;/*编码结点类型*/
typedefcodenodehuffmancode[n+1];/*huffmancode是结构数组类型,其0号单元不用,存储哈夫曼编码*/
voidinithuffmantree(huffmantreeht)/*初始化哈夫曼树函数inithuffmantree()*/
{inti;
for(i=0;i<=m;i++)
{ht[i].weight=0;
ht[i].lchild=ht[i].rchild=ht[i].parent=0;
}
}
voidinputweight(huffmantreeht)/*输入权值函数*/
{inti;
for(i=1;i<=n;i++)
{
printf("……请输入第[%d]个权值:
",i);
scanf("%d",&ht[i].weight);
}
printf("\n");
}
voidselectmin(huffmantreeht,inti,int*p1,int*p2)
/*在ht[1..i]中选两个权值最小的根结点,其序号为*p1和*p2,*p1中放权值最小的根结点的序号,*p2中放权值次小的根结点的序号*/
{intj,min1,min2;/*min1,min2分别是最小权值和次小权值*/
min1=min2=32767;
*p1=*p2=0;
for(j=1;j<=i;j++)
{if(ht[j].parent==0)/*j为根结点*/
if(ht[j].weight{
if(min1!
=32767){min2=min1;*p2=*p1;}
min1=ht[j].weight;*p1=j;
}
else
if(ht[j].weight{min2=ht[j].weight;*p2=j;}
}
}
voidcreatehuffmantree(huffmantreeht)/*构造huffman树,ht[m]为其根结点*/
{
inti,p1,p2;
inithuffmantree(ht);/*将ht初始化*/
inputweight(ht);/*输入叶子权值至ht[1..n]的weight域*/
for(i=n+1;i<=m;i++)/*共进行n-1次合并,新结点依次存于ht[i]中*/
{selectmin(ht,i-1,&p1,&p2);/*在ht[1..i-1]中选择两个权值最小的根结点,其序号分别为p1和p2*/
ht[p1].parent=ht[p2].parent=i;
ht[i].lchild=p1;/*最小权值的根结点是新结点的左孩子*/
ht[i].rchild=p2;/*次小权值的根结点是新结点的右孩子*/
ht[i].weight=ht[p1].weight+ht[p2].weight;
}
}
voidhuffmancodes(huffmantreeht,huffmancodehcd)/*根据huffman树ht求huffman编码*/
{
intc,p,i;/*c和p分别指示ht中孩子和双亲的位置*/
charcd[n+1];/*临时存放编码*/
intstart;/*指示编码在cd中的起始位置*/
cd[n]='\0';
getchar();/*编码结束符*/
printf("2.……请依次输入字符……:
");
for(i=1;i<=n;i++)/*依次求叶子ht[i]的编码*/
{hcd[i].ch=getchar();/*读入叶子ht[i]对应的字符*/
start=n;/*编码起始位置的初值*/
c=i;/*从叶子ht[i]开始上溯*/
while((p=ht[c].parent)!
=0)/*直至上溯到ht[c]是树根为止*/
{cd[--start]=(ht[p].lchild==c)?
'0':
'1';/*若ht[c]是ht[p]的左孩子,则生成代码0,否则生成代码1*/
c=p;/*继续上溯*/
}
strcpy(hcd[i].code,&cd[start]);/*复制编码位串*/
}
printf("\n");
printf("3.………哈夫曼编码结果为:
……\n");
printf("\n");
for(i=1;i<=n;i++)
printf("……第[%d]个字符[%c]的编码为:
%s\n",i,hcd[i].ch,hcd[i].code);
}
voidmain()
{huffmantreet;
huffmancodeh;
printf("|^^^^^^^^^^^^^^^^^^^^^^^^^^^*########################*^^^^^^^^^^^^^^^^^^^|\n");
printf("|^^^^^^^^^^^^^^^^^^^^^^^^^^^*欢迎使用哈弗曼编码系统!
*^^^^^^^^^^^^^^^^^^^|\n");
printf("|^^^^^^^^^^^^^^^^^^^^^^^^^^^*########################*^^^^^^^^^^^^^^^^^^^|\n");
printf("\n");
printf("1.…………请输入%d个权值:
……\n",n);
printf("\n");
createhuffmantree(t);/*构造huffman树*/
huffmancodes(t,h);/*构造huffman编码*/
}
8.实验心得
通过这次课程设计,使我获益匪浅。
学好数据结构对于我们是非常重要的,能使我们在以后的程序设计方面给我们很大的帮助。
以此同时,这门课程的学习也是非常艰辛的,因为它比较抽象难懂,这需要我们在实践中不断的克服。
将近一个多星期的设计工作,让我体会到作为一个编程人员是非常辛苦的。
一个程序从算法到实现,再到应用开发是需要走很长的一段路,不是一朝一夕就能实现的。
编程过程中的辛苦只有亲身体会才能明白,所以编好一个程序对于我们是非常不容易的。