哈夫曼编码算法 c语言,《哈夫曼编码的算法》

以前的作业,拿出来看看,都不会了。郁闷

记得当时为了完成这作业,求了一圈朋友,最后还是在图书馆网络中找的!呵呵!在这里晒晒了

设计报告内容:

一、 课程设计名称

《哈夫曼编码的算法》

二、 使用工具

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();}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值