哈弗曼编码的c语言实现代码
2013-10-25 16:39
363 查看
#include <stdio.h>
#include <stdlib.h> int count=0; //节点数 int frequent[10]={0}; //存储所有字符的频率的字符串 typedef struct huff { int left; int right; int freq; char ch; int level; //用来进行huffcode }HuffNode,*HuffTree; //select 函数 void select(HuffNode *t,int len,int *a,int *b) { int i=1; if(t[1].freq<t[2].freq) { *a=1; *b=2; } else { *a=2; *b=1; } for(i=3;i<=len;i++) { if(t[i].freq<t[*a].freq) { *b=*a; *a=i; } else if(t[i].freq<t[*b].freq) *b=i; } } //建立哈弗曼树 HuffTree buildHufftree(int *freq) { int i,m; //m用来暂存count的值 int m1,m2; HuffNode *node; for(i=0;i<256;i++) if(freq[i]) count++; m=count; node=(HuffNode *)malloc((2*count)*sizeof(HuffNode)); //建立所有节点,一共是2count-1个 for(i=0;i<256;i++) { if(freq[i]) //count 表示了节点的数目,所以节点是从node[1]开始 { node[m].freq=freq[i]; node[m].ch=(char)i; node[m].left=0; node[m].right=0; m--; } } //建立树,count-1次循环,通过select函数选出当前freq最小的两个节点 for(i=0;i<count-1;i++) { select(node,count+i,&m1,&m2); //从前count+i个节点中选出最小的两个 node[count+i+1].freq=node[m1].freq+node[m2].freq; node[m1].freq=1000000; //将原先的叶子排除在下次的选择范围中 node[m2].freq=1000000; node[count+i+1].left=m1; node[count+i+1].right=m2; // printf("%d--%d freq:%d\n",m1,m2,node[count+i+1].freq); } return node; } //生成huffcode void huffcode(HuffTree t) { int i,j; int *temp; t[2*count-1].level=0; t[2*count-1].freq=0; //这里将freq 当做 sum来使用,计数每个点的值,用来生成huffcode for(i=2*count-1;i>count;i--) { t[t[i].left].level=t[i].level+1; t[t[i].right].level=t[i].level+1; t[t[i].left].freq=t[i].freq*2; t[t[i].right].freq=t[i].freq*2+1; } for(i=count;i>=1;i--) { printf(" %c freq:%d HuffCode:\t",t[i].ch,frequent[t[i].ch]); temp=(int *)malloc(t[i].level*sizeof(int)); //用temp来存储编码 for(j=0;j<t[i].level;j++) { temp[t[i].level-1-j]=t[i].freq%2; t[i].freq/=2; } for(j=0;j<t[i].level;j++) printf("%d",temp[j]); // free(temp); printf("\n"); } } void main (){ char *str="my name is veim,i like coding"; //输入你想要进行编码的字符串 printf("被编码字符串为:"); puts(str); int i=0; HuffTree T; while(*str!='\0') { frequent[*str++]++; } T=buildHufftree(frequent); huffcode(T); }
[/code]
运行结果如图:
相关文章推荐
- 黑马程序员-----C语言学习之通讯录应用的代码实现
- java哈弗曼编码的实现
- android相册选择图片的编码实现代码
- 数据结构 --静态队列的一个简单的C语言代码实现
- 动手敲代码——链表(C语言实现)
- C语言实现修改文本文件中特定行的实现代码(百度一天没找到,bing搜索十分钟就找到了)
- C语言实现base64编码
- 算数编码的C语言实现
- 快速排序的c语言实现代码
- 排序算法之希尔排序<Shell_Sort>及其C语言代码实现
- c语言部分库函数,代码实现,以及细节理解
- 吊死鬼游戏Hangman游戏的C语言实现代码
- 文章【Android 的视频编码 H263 MP4V H264】的代码实现
- 【C语言】编写代码实现:求一个整数在内存中的二进制位中1的个数
- Java实现的UTF-8,GBK,Unicode编码相互转换的代码
- 文章【Android 的视频编码 H263 MP4V H264】的代码实现
- [C语言教程]指针转换方式实现C语言的指针操作安全代码
- 中文转换成Unicode编码和Unicode编码转换成中文,Java代码实现
- C语言字符串库函数的实现也是笔试题常考的题目,以下代码没有严格测试,只是简单的实现:
- [转] Socket心跳包异常检测的C语言实现,服务器与客户端代码案例