C语言实现哈夫曼编码
2016-02-04 18:22
441 查看
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct{ char ch; int weight; int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef char ** HuffmanCode; void Select(HuffmanTree HT,int n,int &s1,int &s2){ int min1,min2,i; min1=min2=999; s1=s2=0; for(i=1;i<=n;i++){ if(!HT[i].parent){ if(HT[i].weight<min1){ min2=min1; s2=s1; min1=HT[i].weight; s1=i; } else if(HT[i].weight<min2){ min2=HT[i].weight; s2=i; } } } } void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int w[],int n,char str[]){ int i,m,s1,s2; int start,f,c; char *cd; if(n<=1) exit(0); m=2*n-1; //结点数 HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0单元不用 HT[0].ch=' '; HT[0].lchild=0; HT[0].weight=0; HT[0].parent=0; HT[0].rchild=0; for(i=1;i<=n;i++){ HT[i].ch=str[i-1]; HT[i].weight=w[i-1]; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } for(;i<=m;i++){ HT[i].ch=' '; HT[i].weight=0; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } for(i=n+1;i<=m;i++){ //建树 Select(HT,i-1,s1,s2); HT[s1].parent=i; HT[s2].parent=i; HT[i].lchild=s1; HT[i].rchild=s2; HT[i].weight=HT[s1].weight+HT[s2].weight; } printf("标号 电文字符 权值 左孩子 右孩子 父母\n"); for(i=1;i<=m;i++) printf("%d\t%3c%7d\t%d\t%d\t%d\t\n",i,HT[i].ch,HT[i].weight,HT[i].lchild,HT[i].rchild,HT[i].parent); HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); cd=(char*)malloc(n*sizeof(char)); cd[n-1]='\0'; for(i=1;i<=n;i++){ start=n-1; for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) if(HT[f].lchild==c) cd[--start]='0'; else cd[--start]='1'; HC[i]=(char *)malloc((n-start)*sizeof(char)); strcpy(HC[i],&cd[start]); } free(cd); } int main(){ HuffmanTree HT; HuffmanCode HC; char str[20]; int w[20],i,j; printf("输入字符个数\n"); scanf("%d",&j); getchar(); printf("请输入字符\n"); gets(str); printf("输入字符权值\n"); for(i=0;i<j;i++) scanf("%d",&w[i]); HuffmanCoding(HT,HC,w,j,str); printf("哈夫曼编码:\n"); for(i=1;i<=j;i++){ printf("%c --> ",str[i-1]); puts(HC[i]); } return 0; }
相关文章推荐
- C++判断一个数是否为整数
- C++无序元素直接排序法
- C++代码重构——从C global到C++ template
- C++将二叉树转为双向链表及判断两个链表是否相交
- hdu1097
- C++实现查找二叉树中和为某一值的所有路径的示例
- C语言——希尔排序
- 约瑟夫环问题(结构体指针实现)
- hdu1005
- C++ previous declaration of...with 'C++' linkage
- C++使用STL:慎重选择删除元素的方法
- C++/MFC修行之路(3) MFC中各个类的互相访问/取指针
- C++扫雷
- POJ3461 字符串双HASH
- USACO 5.1.1 凸包参考程序
- C++/MFC修行之路(2) 自定义消息
- C/C++ extern关键字用法
- C语言中,一级指针,二级指针,数组,一位数组指针,二位数组指针浅谈
- ISBN编码
- c++ 多重继承