以前的作业,拿出来看看,都不会了。郁闷
记得当时为了完成这作业,求了一圈朋友,最后还是在图书馆网络中找的!呵呵!在这里晒晒了
设计报告内容:
一、 课程设计名称
《哈夫曼编码的算法》
二、 使用工具
TC (C语言环境)
三、 课程设计内容简介
(1) 此课程设计是关于“哈夫曼编码算法的实现”。
课程目的是为了了解哈夫曼算法的思路核心,掌握哈夫曼算法在压缩算法中的基本应用,全面提高程序设计开发能力,并将程序应用于现实。
设计结构主要由三部分组成,分别是定义,子函数,主函数;
定义:编码类型定义 输入符号的类型 调用库函数
子函数:①编码类型定义,输入字符的类型
②对输入字符按权值大小进行排序
③构建haffman树
④寻找权值最小与次小的节点
⑤权值最小与次小的节点进行组合
⑥按节点位置进行编码
⑦存储编码
⑧输入‘1’‘0’码进行译码
⑨按路径寻找进行译码
⑩计算字符个数与出现次数
主函数:调用子函数 输出提示的语句
定义一些变量
(2)程序流程图:(略)
(3)得意之处
此程序中我的得意之处有两处,如下:
其中,按路径寻找进行译码(树的左孩子为0,右孩子为1)。在程序中我们可以通过此子程序找到编码所代表的字母是什么。子程序如下:
while(*m!=NULL)
{if(*m=='0')
{c=i=HuffNode[c].lchild;
if(HuffNode[c].lchild==-1&&HuffNode[c].rchild==-1)
{printf("%c",HuffNode[i].letter);c=2*n-2;}}
if(*m=='1')
{c=i=HuffNode[c].rchild;
if(HuffNode[c].lchild==-1&&HuffNode[c].rchild==-1)
{printf("%c",HuffNode[i].letter);c=2*n-2;}}
m++;
} }
在程序中,我还运用了C语言中的冒泡法进行对输入字符权值大小的排序。此子程序不仅简单易懂,操作简便,还可以快速地进行排序,节省大量的时间。子程序如下:
for(j=i+1;j
if(a[j].num>a[i].num)
{temp1=a[i].num;a[i].num=a[j].num;a[j].num=temp1;
temp2=a[i].s;a[i].s=a[j].s;a[j].s=temp2;}
总的来说,程序具有随意性,用户可以任意的输入一串字符,进行编码译码查找,方便易行,界面友好,具有可读性,清晰明了。
(4)创意的实现
创意的实现是根据haffman编码的一些基础知识,C语言的知识。例如:对输入字符按权值大小进行排序的子程序中,就运用了C语言中的冒泡法进行大小排序。
for(j=i+1;j
if(a[j].num>a[i].num)
{temp1=a[i].num;a[i].num=a[j].num;a[j].num=temp1;
temp2=a[i].s;a[i].s=a[j].s;a[j].s=temp2;}
(5)程序所存在的问题
此程序还不够完善,只能进行简单的编码译码,对一些简单的字符进行编码译码和寻码,但是对于大量的数据还没进行过验证,对超出定义权值最大值,叶子最多个数,编码的最大位数,不能解决,所以还是不能真正的应用于现实生活之中,与真正的现实生活应用还有一段距离。
(6)自我感受
通过此次课程设计,使我更加深刻的了解了哈夫曼编码,通过自己思考动手去设计一个程序,并且完全实现此程序的正确性,更加锻炼了我们的动手能力。假设每种字符在电文中出现的次数为wi
,其编码长度为li ,电文中只有n中字符,则电文总长为 ∑ wili。对应到二叉树上,若置
wi为叶子节点的权,li恰为从根到叶子的路径长度。则∑ wili恰为二叉树上带权路径长度。
由此可见,设计电文总长最短的二进制前缀编码极为以n中字符出现的频率作权,涉及一颗哈夫曼树的问题,由此的得到的二进制前缀编码便称哈夫曼编码。我所编的程序里就是把一段电文编译成哈夫曼编码
,在通过哈夫曼编码进行寻找所对应的电文字母。而且通过此次的课程设计,让我更深入的理解力数据结构,并且还运用了以前所学的有关C语言的知识,并且应用到我的程序中去,这是我最高兴得了,一直认为C语言学习万并没有什么用处,但是在此次的课程设计中让我明白了任何知识都有它的用途。
此程序主要涉及到了哈夫曼树,包括哈夫曼的构造,哈夫曼树的遍历,哈夫曼树和哈夫曼编码的存储表示,求字符的编码等等一些技术。以上这些每一点都是哈夫曼树基本的知识,但是运用到课程设计中要求把每一个知识点都组合起来,编写成一个完整的,能实现一个功能的程序,因此难度有所增大。把每个程序连接起来当然是不够的,而且还要求一个主函数来实现它,通过主函数来调用各个函数,才能完整整个程序。在编程中主要是应用C语言的知识,
通过此次课程设计,还让我们以前模糊的知识得到了更深刻的理解,清晰了我们的思路,引导我们向知识的深处去挖掘探索,在理解知识的基础上进行更深刻的探索。
在进行课程设计的过程中,我们进行了小组讨论
,增强了小组之间的合作能力,同学之间可以各自发表自己的意见、说出自己的想法、证明自己的程序是否正确、吸取别人的经验、听取别人的意见、吸收别人的长处、弥补自己程序的不足。而且在小组讨论之间我们不仅有组内合作,还有组间竞争。即增进了同学之间的友谊,有加进同学之间的竞争。
一、 参考文献
《数据结构》(c语言版) 严蔚敏 吴伟民 编著
——北京清华大学出版社
《C语言程序设计》 王曙燕等 科学出版社
《数据结构——使用C语言》 陈一华等 电子科技大学出版社
谭浩强,《C语言程序设计》,清华大学出版社,北京。
程序如下:
#include
#define MAXVALUE 10000
#define MAXLEAF 30
#define MAXNODE MAXLEAF*2-1
#define MAXBIT 50
typedef struct node
{char letter;
int weight;
int parent;
int lchild;
int rchild;
}HNodeType;
typedef struct
{char letter;
int bit[MAXBIT];
int start;
}HCodeType;
typedef struct
{char s;
int num;
}Bowen;
void HuffmanTree(HNodeType HuffNode[],int n,Bowen a[])
{int i,j,m1,m2,x1,x2,temp1;char temp2;
for(i=0;i<2*n-1;i++)
{HuffNode[i].letter=NULL;
HuffNode[i].weight=0;
HuffNode[i].parent=-1;
HuffNode[i].lchild=-1;
HuffNode[i].rchild=-1;}
for(i=0;i
for(j=i+1;j
if(a[j].num>a[i].num)
{temp1=a[i].num;a[i].num=a[j].num;a[j].num=temp1;
temp2=a[i].s;a[i].s=a[j].s;a[j].s=temp2;}
for(i=0;i
for(i=0;i
{m1=m2=MAXVALUE;
x1=x2=0;
for(j=0;j
{ if(HuffNode[j].parent==-1&&HuffNode[j].weight
{m2=m1;x2=x1;
m1=HuffNode[j].weight; x1=j;}
else
if(HuffNode[j].parent==-1&&HuffNode[j].weight
{m2=HuffNode[j].weight;
x2=j;}
} HuffNode[x1].parent=n+i;HuffNode[x2].parent=n+i;
HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight;
HuffNode[n+i].lchild=x1; HuffNode[n+i].rchild=x2;}}
void HuffmanCode(int n,Bowen a[])
{HNodeType HuffNode[MAXNODE];
HCodeType HuffCode[MAXLEAF],cd;
int i,j,c,p,*q;char code[30],*m;
HuffmanTree(HuffNode,n,a);
for(i=0;i
{cd.start=n-1;
c=i;
p=HuffNode[c].parent;
while(p!=-1)
{if(HuffNode[p].lchild==c)
cd.bit[cd.start]=0;
else
cd.bit[cd.start]=1;
cd.start--;
c=p;
p=HuffNode[c].parent;}
for(j=cd.start+1;j
HuffCode[i].bit[j]=cd.bit[j];
HuffCode[i].start=cd.start;}
for(i=0;i
{HuffCode[i].letter=HuffNode[i].letter;
printf("%c ",HuffCode[i].letter);
for(j=HuffCode[i].start+1;j
printf("%d",HuffCode[i].bit[j]);
printf("\n");}
printf("Now,input the code(1/0):\n");
for(i=0;i<30;i++) code[i]=NULL;
scanf("%s",&code); m=code;
c=2*n-2;
while(*m!=NULL)
{if(*m=='0')
{c=i=HuffNode[c].lchild;
if(HuffNode[c].lchild==-1&&HuffNode[c].rchild==-1)
{printf("%c",HuffNode[i].letter);c=2*n-2;}}
if(*m=='1')
{c=i=HuffNode[c].rchild;
if(HuffNode[c].lchild==-1&&HuffNode[c].rchild==-1)
{printf("%c",HuffNode[i].letter);c=2*n-2;}}
m++;
} }
main()
{Bowen data[30];
char s[100],*p;
int i,count=0;clrscr();
printf("Input some letters:");
scanf("%s",&s);
for(i=0;i<30;i++)
{data[i].s=NULL;
data[i].num=0;}
p=s;
while(*p)
{for(i=0;i<=count+1;i++)
{if(data[i].s==NULL)
{data[i].s=*p;data[i].num++;count++;break;}
else if(data[i].s==*p)
{data[i].num++;break;}}
p++;}
printf("\n");
printf("different letters:%d\n",count);
for(i=0;i
{printf("%c ",data[i].s);
printf("weight:%d",data[i].num);
printf("\n\n");}
HuffmanCode(count,data);
getch();}