哈夫曼编码的原理看
百度百科
先生成一个哈夫曼树,参考
哈夫曼树c语言实现
生成接近等长码
须要注意的是,为了缩短码长方差,且编出的码更接近于等长码,排序的时候,第一优先级为概率大小,第二优先级为左节点是否为空

int cmp(left a, left b)
{if (a.data == b.data){if (a.left != NULL){return 1;}if (b.left != NULL){return 0;}}else return a.data > b.data ? 1 : 0;
}

用dfs读取哈夫曼编码
读取哈夫曼编码的时候,从树的根部开始读,能往左走,就读入一个‘1’,能往右走就读入一个‘0’,遇上左节点为空,说明已经读取了一个编码,同时,我们读到的这个节点的概率就是这个编码对应的概率。

void print_treef(left* root,int n,int *now,int len)//就是dfs,
//函数中参数的含义依次为当前节点,编码总数(实际没有用),当前读取的编码编号,深度。
{int t = 0;if (root->left != NULL){sprintf(temp+len, "%d", 1);print_treef(root->left, n,now,len+1);t = 1;}if (root->right != NULL){sprintf(temp + len, "%d", 0);//相当于temp[len]=‘0’;print_treef(root->right, n,now,len+1);t = 1;}if (t == 0){sprintf(ans[*now].code, "%s", temp);ans[*now].p = root->data;//    ans[*now].code[len]= '\0';*now += 1;}
}

源代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct hahahacode
{double p;char code[10];
}Code;
Code ans[10];
typedef struct hahahahahaha
{struct hahahahahaha* father;struct hahahahahaha* left;struct hahahahahaha* right;double data;
}left;
left* creat_left()
{left* s = (left*)malloc(sizeof(left));s->father = NULL;s->left = NULL;s->right = NULL;return s;
}
int cmp(left a, left b)
{if (a.data == b.data){if (a.left != NULL){return 1;}if (b.left != NULL){return 0;}}else return a.data > b.data ? 1 : 0;
}
void sortans(int n)
{int i = 0, j = 0, t;Code tt;for (i = 0; i < n - 1; i++){for (j = 0; j < n - 1-i; j++){if (ans[j].p == ans[j + 1].p){if (strcmp(ans[j].code, ans[j + 1].code) >= 0){tt = ans[j], ans[j] = ans[j + 1]; ans[j + 1] = tt;}}else if (ans[j].p<ans[j+1].p){tt = ans[j], ans[j] = ans[j + 1]; ans[j + 1] = tt;}}}// 蹩脚插排
}
void sort(left* a[], int n)
{int i = 0, j = 0, t;left* tt;for (i = 0; i < n - 1; i++){for (j = 0; j < n - 1-i; j++){if (cmp(*a[j], *a[j + 1])){tt = a[j], a[j] = a[j + 1]; a[j + 1] = tt;}}}// 蹩脚插排
}
left* built_tree(double* a, int n)
{int i = 0;left* b[205];while (i < n){left* s = creat_left();s->data = a[i];b[i] = s;//printf("%d ", b[i]->data);i++;}int j = 0;while (j < 150){b[i + j] = creat_left();j++;}i = n / 2 - 1;sort(b, n);//printf("%d", b[0]->data);left* s = NULL;while (n > 1){double dad = b[0]->data + b[1]->data;s = creat_left();s->data = dad;b[0]->father = s;b[1]->father = s;s->left = b[0];s->right = b[1];b[0] = s;b[1] = b[n - 1];n--;sort(b, n);}return s;
}
void print_tree(left* root, int deep)
{int  i = 0;while (i < deep){printf("-");i++;}printf("%.2f\n", root->data);if (root->left != NULL){print_tree(root->left, deep * 2);}if (root->right != NULL){print_tree(root->right, deep * 2);}
}
char temp[100];
void print_treef(left* root,int n,int *now,int len)
{int t = 0;if (root->left != NULL){sprintf(temp+len, "%d", 1);print_treef(root->left, n,now,len+1);t = 1;}if (root->right != NULL){sprintf(temp + len, "%d", 0);print_treef(root->right, n,now,len+1);t = 1;}if (t == 0){sprintf(ans[*now].code, "%s", temp);ans[*now].p = root->data;//    ans[*now].code[len]= '\0';*now += 1;}
}
int main()
{double a[10] = {0.4,0.1,0.2,0.2,0.1};left* root = built_tree(a, 5);int len = 0;printf("树\n");print_tree(root, 1);printf("编码\n");print_treef(root, 1,&len,0);sortans(5);for (int i = 0; i < 5; i++){printf("u%d: p=%.2f ", i + 1,ans[i].p);printf("%s\n", ans[i].code);}
}

哈夫曼编码c语言实现相关推荐

  1. 信息论 输入概率的哈夫曼编码 C语言

    信息论 哈夫曼编码 C语言 哈夫曼编码是一种效率比较高的变长无失真信源编码方法.哈夫曼编码的编码方法,步骤如下: 将信源符号按概率从大到小的顺序排列,为方便起见,令p(a1)>=p(a2)> ...

  2. 哈夫曼编码c语言论文,哈夫曼编码的实现及应用论文.doc

    哈夫曼编码的实现及应用论文 毕 业 设 计(论文) 题目 哈夫曼编码的实现 及应用 二级学院 数学与统计学院 专 业 信息与计算科学 班 级 学生姓名 张泽欣 学号 指导教师 职称 时 间 目录 摘要 ...

  3. c语言用赫夫曼编码压缩文件,用哈夫曼编码C语言实现文件压缩

    用哈夫曼编码实现文件压缩,C语言编写,简单实用, if(j%8!=0) /*按八位读取*/ { for(f=j%8;f<8;f++) strcat(header[i].bits,"0& ...

  4. 信息论霍夫曼编码c语言,霍夫曼编码

    <信息论与编码>课程实验报告 姓 名 学 号 单 位 专 业 2014 年 12 月 4 日 实验一 一.实验目的 1.理解信源编码的意义: 2.掌握霍夫曼编码的方法及计算机实现: 二.实 ...

  5. 南邮哈夫曼编码c语言代码_漫画:“哈夫曼编码” 是什么鬼?

    ​在上一期,我们介绍了一种特殊的数据结构 "哈夫曼树",也被称为最优二叉树.没看过的小伙伴可以点击下方链接: 漫画:什么是 "哈夫曼树" ? 那么,这种数据结构 ...

  6. 信息论霍夫曼编码c语言,Huffman 信息论与编码 - 下载 - 搜珍网

    霍夫曼编码/Shiyan4/Shiyan.sln 霍夫曼编码/Shiyan4/Shiyan.suo 霍夫曼编码/Shiyan4/Shiyan.v11.suo 霍夫曼编码/Shiyan4/Shiyan4 ...

  7. c语言递归计算哈夫曼编码,哈夫曼树遍历求WPL和哈夫曼编码C语言--For初学者

    这篇文章使用纯c来写的,实现了生成哈夫曼树.求WPL和生成哈夫曼编码的应用,思路是,先定义一个结构体如下 typedef struct node { int weight; struct node * ...

  8. 二进制哈夫曼编码c语言实现,二进制霍夫曼编码

    通过查看其他博客的内容,整理一篇关于二进制霍夫曼编码的笔记供大家参考和讨论,如果有错误,欢迎大家联系我批评指正. 一.二进制霍夫曼的原理 我们可以将二进制霍夫曼编码拆分理解: 二进制即 0.1: 二进 ...

  9. 贪心算法哈夫曼编码c语言,贪心算法详解:哈夫曼编码

    理解贪心算法 贪心算法是一种算法思想,并不是一个具体的算法,因此我们用两个例子来理解什么样的问题适合用贪心算法解决. 例一 现在有一个能装 100g 物品的背包,和一些可拆分的物品(见表格),怎么装才 ...

最新文章

  1. debian 10 ssh简单配置
  2. Nat. Mach. Intell. | 生物医学关系抽取的机器学习新框架
  3. 【求助】哪个软件负责在屏幕右下角显示类似“caps lock on/off”的? - 技术封存区 - 专门网论坛 -...
  4. 致远协同软件手机版让移动办公不再是梦想
  5. 老男孩linux培训期中学生作业文档目录展示
  6. HDFS配置Kerberos
  7. Web开发学习路线图
  8. 酷派android是什么系统版本,酷派大神X7的手机系统是什么?能升级安卓5.0吗?
  9. NppFTP小插件的使用
  10. 探讨C#的out关键字
  11. 断言java怎么用_[java] java断言的使用
  12. 南京师范大学计算机科学与技术复试名单,2018年各学院硕士研究生复试办法及复试名单公示网址汇总表...
  13. 在java.time.LocalDateTime和java.util.Date之间进行转换
  14. 《变革中的思索》连载九:放飞的爱——母亲和我
  15. 关于 javadoc
  16. html文件怎么用华为手机打开,如何调整华为手机中的文件默认打开方式
  17. 雅虎“贱卖”启示录:不创新,就只有被淘汰
  18. Android仿人人客户端(v5.7.1)——有关滑动式左侧菜单实现过程中网友的疑问解答
  19. 并行处理系统 计算机网络 分布式系统,分布式并行信号处理系统,Distributed parallel signal processing system,音标,读音,翻译,英文例句,英语词典...
  20. 【UCOSii源码解析】事件控制块

热门文章

  1. 欧姆龙c200he基本语言,欧姆龙C200HE-CPU11-E操作手册 - 广州凌控
  2. oracle rac vip什么用,Oracle VIP说明
  3. delphi10.4使用uniGUI
  4. vue-admin-template配置语言包
  5. 从多个pdf文档中截取部分区域拼接成一个pdf文档
  6. Servlet从服务器下载文件 步骤+代码
  7. mac tcp调试命令
  8. html烟花特效案例,HTML5前端特效库 css3 按钮粒子烟花特效源码
  9. 怎样更换计算机开机画面,如何给win10电脑更换一个漂亮的开机界面
  10. 计算机毕业设计系列基于基于SSM的小区物业信息管理系统