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

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

设计报告内容:

一、 课程设计名称

《哈夫曼编码的算法》

二、 使用工具

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

哈夫曼编码算法 c语言,《哈夫曼编码的算法》相关推荐

  1. php 红包算法,PHP语言:实现微信红包拆分算法

    本文主要向大家介绍了PHP语言:实现微信红包拆分算法,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. · 修复最后一个红包输出未保留2位数 · 修复领取的红包金额低于最小红包限制 * 红 ...

  2. 人工免疫算法c语言实例,毕业设计_蚁群算法模拟系统的设计与实现.doc

    J I A N G S U U N I V E R S I T Y 本 科 毕 业 论 文 蚁群算法模拟系统的设计与实现 Ant Colony Simulation System Design and ...

  3. 【数据结构与算法——C语言版】1. 数据结构与算法简介

    概念 数据结构:"一组数据的存储结构" 算法:"操作数据的一组方法" 数据结构是为算法服务的,算法是要作用再特定的数据结构上的. 简言之,在编程实践中,我们可能 ...

  4. 栅格法路径算法C语言,基于地图栅格与QPSO算法结合的机器人路径规划方法与流程...

    本发明属于机器人路径规划领域,提出一种基于地图栅格与QPSO结合的机器人路径规划方法. 背景技术: 移动机器人路径规划是寻找一条无碰撞的可行路径问题的方法.近些年,群智能优化算法逐渐成为移动机器人路径 ...

  5. 机械臂运动学算法c语言,6轴工业机械臂运动学算法(C++) 六轴机械臂运动学源码 - 下载 - 搜珍网...

    6轴工业机械臂运动学算法 6轴工业机械臂运动学算法\.cproject 6轴工业机械臂运动学算法\.project 6轴工业机械臂运动学算法\.settings 6轴工业机械臂运动学算法\.setti ...

  6. 极值跟踪算法 c语言,快速约束极值子空间跟踪算法_魏志强.pdf

    快速约束极值子空间跟踪算法_魏志强 34 4 Vol. 34 No. 4 第 卷第 期 华 北 水 利 水 电 学 院 学 报 2013 8 Journal of North China Instit ...

  7. pbkdf2 算法 C语言实现,密码学基础之PBKDF2算法

    站点登录需要输入用户名和密码,而密码属于个人敏感数据,应当只保存密码的单向哈希值.简单的哈希值,无法防止彩虹表攻击,使用基于口令的密钥派生算法PBKDF2可以解决这种问题. PBKDF2 需要以下输入 ...

  8. 快速pow算法c语言_嵌入式必知基础算法(二)

    七.二分法 在一个数组中,知道一个数值,想确定他在数组中的位置下标,如数组:A[5] = {1,2,6,7,9};我知道其中的值为6,那么他的下标位置就是3. 八.限幅滤波法 对于随机干扰 , 限幅滤 ...

  9. c语言顺序查找算法,c语言实现排序和查找所有算法

    c语言版排序查找完成,带详细解释,一下看到爽,能直接运行看效果. /* Note:Your choice is C IDE */ #include "stdio.h" #inclu ...

  10. 异或校验算法 c语言程序,C# 异或校验算法

    C# 的异或校验算法 直接上代码 public partial class FormCRC : Form { public FormCRC() { InitializeComponent(); } p ...

最新文章

  1. 十款让 Web 前端开发人员更轻松的实用工具
  2. HDOJ/HDU 2566 统计硬币(公式~遍历~)
  3. recyclerview滑动到顶部和底部监听+上滑下滑监听
  4. Ubuntu下安装vscode c++环境
  5. html表单显示提示,html侧栏对应表单的提示显示
  6. linux如何设置账号全民,linux基本练习:用户和组管理的相关练习
  7. adb shell 命令之----pm
  8. 创新方法(TRIZ)理论及应用(一)
  9. 如何在套接字IO操作上设置超时机制
  10. Cortex M3/M4 学习摘要(一)
  11. python3 鼠标定位输入及其点击实例
  12. ros操作系统的介绍
  13. 机器学习周志华第一章
  14. linux 管道 减号,linux shell环境减号”-”的用途
  15. 人工智能/机器人/工程类投稿期刊、会议推荐
  16. fastadmin页面日期时间组件的调用
  17. c语言RLC算法,「百科」1分钟了解RC、RL、RLC电路原理
  18. Photoshop鼠绘精美手机详细教程
  19. PCB阻焊油墨知识汇总
  20. 前端基础之Html、CSS、JavaScript、JQuery、Ajax

热门文章

  1. Volo.Abp 整合 WebApiClient 从请求中获取 Headers 信息
  2. MyEclipse 安装TFS插件详解
  3. 手游海外聚合SDK介绍
  4. 2021物联网开发学习——基于小熊派IoT开发板Bear-Pi-IOT、E53_IA1_智慧农业拓展板与小熊派-鸿蒙·季Bear-Pi-HM Nano并接入Hi-Link
  5. 《设备管理系统》设计文档【Java+Eclipse】
  6. freemarker转PDF,支持分页,增加页眉页脚
  7. 成都工业职业技术学校计算机,成都市计算机工业职业技术学校2020年招生简介...
  8. 欧几里得和扩展欧几里得算法
  9. MATLAB imref2d函数的理解与使用
  10. 编写一个C语言程序,输出如下图形(鱼) (5 分)