数据结构哈夫曼编码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计说明书(论文) 题目哈夫曼编码
课程名称数据结构
院系
专业
班级
学生姓名
学号
设计地点
指导教师
设计起止时间:2010年1月4日至2010年1月7日
目录
1.功能描述(或设计目标) (3)
2.总体设计(或概要设计) (3)
2.1数据结构描述与定义 (3)
2.2模块设计 (3)
3.测试结果与分析 (4)
4.课程设计总结 (5)
参考文献: (6)
附录: (6)
1.功能描述(或设计目标)
要求:(1)从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。
(2)输出n个字符的哈夫曼编码
2.总体设计(或概要设计)
2.1数据结构描述与定义
首先定义了一个结构体用来存放结点的信息,双亲,左右孩子及权值。
typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char *HuffmanCode;
2.2模块设计
3.测试结果与分析
4.课程设计总结
虽然已经经历过好多次课程设计了,但是每次都有新的收获与体会。就拿这次课程设计来说吧,总体上还可以,发现了自己的不足也学到了不少知识,解决了一些问题,这些都令我很欣慰。但是准备的并不怎么充分。老师很早就把题目给我们了,但后来并没有怎么准备。本来觉得自己的题目难先换成其他的课题的,但是后来想挑战一下自己。后来翻了翻书本以及老师给的PPT发现这个课题也不是自己想的那么难。书上有一些程序但是不完善,自己需要补充修改。
通过查阅资料以及自己的努力终于把程序修改编辑的没有语法错误,但是运行到一半就没法运行了,最难改的就是逻辑错误了。经请教老师,自己的思考以及一遍又一遍的调试终于也把逻辑错误也解决了。在此基础上又对程序进行了一些优化。
通过发现问题,解决问题,发现自己在这方面的能力变强了,在调试过程中也学到好多知识,改出了许多错误。例如在用scanf()函数输入数据时忘了加去地址符号,虽然刚开始学的时候没犯过这种错误是因为当时老师一直强调,过了一年多,有些淡忘了。在使用指针时也出现了一些错误,忘了给其动态申请空间导致数据输不进去。字符的输入也会出现常见的错误,在此我学会了使用数据流清空函数fflush(stdin);还以一些就不一一列举了。
收获最多的要数程序调试时了,语法错误还算好改一些,但是逻辑错误就不是那么好改了,有时可能就是一点有错,但是却使程序运行不下去。在此当中我学会了断点调试的方法。运用此方法进行不断调试,最后把逻辑错误也解决了。当时真的很高兴。
还令我收获颇多的一点是帮其他同学修改程序中的错误,本来对自己没信心的,但是通过我们的讨论和不断对程序的修改,对自己又有了信心。最终把问题给解决了。
真的很感谢这次课程设计,它不仅使我对自己所学的课程有进一步的了解巩固了所学的理论知识。还让我对自己又充满信心,很有斗志。
参考文献:
1.严蔚敏,吴伟民.数据结构(C语言版).北京:清华大学出版社,1997 2.朱战立.数据结构.西安:西安电子科技大学出版社,2004
3.严蔚敏,吴伟民.数据结构题集(C语言版).北京:清华大学出版社,2000
附录:
#include
#include
#include
int m,s1,s2;
typedef struct
{ unsigned char data;
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char *HuffmanCode;
void Select(HuffmanTree HT,int n)
{
int i,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;
}
void HuffmanCoding(HuffmanTree &HT, HuffmanCode HC[], int *w, int n,char v[]) {
int i, j;
char *cd;
int p;
int cdlen;
if (n<=1) return;
m = 2 * n - 1;
HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode));
for (i=1; i<=n; i++)
{
HT[i].data=v[i-1];
HT[i].weight=w[i-1];
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for (i=n+1; i<=m; i++)
{ HT[i].data=0;
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
printf("哈夫曼树的初态:\n 结点 data weight parent lchild rchild");
for (i=1; i<=m; i++)
printf("\n%4d%8c%8d%8d%8d",i,HT[i].data,HT[i].weight,
HT[i].parent,HT[i].lchild, HT[i].rchild);
for (i=n+1; i<=m; i++)
{