一个可直接用的赫夫曼源代码
来源:互联网 发布:java实现支付功能 编辑:程序博客网 时间:2024/04/27 15:18
#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_NUM 100typedef char ElemType; typedef struct HTNode{ ElemType elem; int m_weight; int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef char** HuffmanCode; typedef int Status; typedef struct weight{ char elem; unsigned int m_weight; }Weight; void Huffman(HuffmanTree *HT,HuffmanCode *HC,Weight *w,int n); void Select(HuffmanTree HT,int n,int *s1,int *s2); void Output(HuffmanTree HT,HuffmanCode HC,int n,char *ch); int main(void) { HuffmanTree HT; HuffmanCode HC; Weight *w; char c[MAX_NUM]={0},c_copy[MAX_NUM]={0}; int frequence[MAX_NUM]; int i,num=0,j,k,l; int daxie[26]={0},xiaoxie[26]={0}; error: printf("请输入需要编码的字符串:"); scanf(" %s",&c); for(j=0;c[j]>0;j++) c_copy[j]=c[j]; for(j=0;c[j]>0;j++) { if(c[j]>='A'&&c[j]<='Z') ++daxie[c[j]-'A']; else if(c[j]>='a'&&c[j]<='z') ++xiaoxie[c[j]-'a']; else {printf("输入中含有非字母元素!请重新输入!\n\n"); for(j=0;j<=26;j++) { daxie[j]=0;xiaoxie[j]=0; } goto error;} } w=(Weight *)malloc(j*sizeof(Weight)); for(k=0;k<=j;k++) { if(c[k]>='A'&&c[k]<='Z') frequence[k]=daxie[c[k]-'A']; else if(c[k]>='a'&&c[k]<='z') frequence[k]=xiaoxie[c[k]-'a']; } for(i=0;i<j;i++) { int q=i;if(q>0){for(q;q>=0;){q=q-1;if(c[i]==c[q]){c[i]=0;frequence[i]=0;}}}if(c[i]!=0&&frequence[i]!=0){w[num].elem=c[i]; w[num].m_weight=frequence[i];num++; } } Huffman(&HT,&HC,w,num); Output(HT,HC,num,c_copy); return 0; } void Huffman(HuffmanTree *HT,HuffmanCode *HC,Weight *w,int n){ int i,m,s1,s2,start,c,f; char *cd; if(n<=1) return; m=2*n-1; (*HT)=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); for(i=1;i<=n;++i) { (*HT)[i].elem=w[i-1].elem; (*HT)[i].m_weight=w[i-1].m_weight; (*HT)[i].parent=(*HT)[i].lchild=(*HT)[i].rchild=0; } for(;i<=m;++i) { (*HT)[i].elem='0'; (*HT)[i].m_weight=(*HT)[i].parent=(*HT)[i].lchild=(*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].m_weight=(*HT)[s1].m_weight+(*HT)[s2].m_weight; } (*HC)=(HuffmanCode)malloc(n*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]); } } void Select(HuffmanTree HT,int n,int *s1,int *s2) { int i; (*s1)=(*s2)=0; for(i=1;i<=n;i++) { if(HT[i].m_weight<HT[(*s2)].m_weight&&HT[i].parent==0&&(*s2)!=0) { if(HT[i].m_weight<HT[(*s1)].m_weight) { (*s2)=(*s1); (*s1)=i; } else (*s2)=i; } if(((*s1)==0||(*s2)==0)&&HT[i].parent==0) { if((*s1)==0) (*s1)=i; else if((*s2)==0) { if(HT[i].m_weight<HT[(*s1)].m_weight) { (*s2)=(*s1); (*s1)=i; } else (*s2)=i; } } } if((*s1)>(*s2)) { i=(*s1); (*s1)=(*s2); (*s2)=i; } } void Output(HuffmanTree HT,HuffmanCode HC,int n,char *ch) { int i,j; printf("\n <各个字符对应的赫夫曼编码表>\n 序号\t 元素\t 权重\t 赫夫曼编码\n"); for(i=1;i<=n;i++) printf(" %d\t %c\t %d\t %s\n",i,HT[i].elem,HT[i].m_weight,HC[i]); printf("\n输入字符串的赫夫曼编码为:"); for(i=0;ch[i]!=0;i++) { j=1; for(j;j<=n;j++) { if(ch[i]==HT[j].elem) printf("%s ",HC[j]); } } printf("\n\n"); }
0 0
- 一个可直接用的赫夫曼源代码
- 一个可玩的贪吃蛇源代码
- 可直接用的三方Dialog
- 单链表的设计和非递归,递归逆序方法源代码,dev-c++下可直接运行.
- 搭建一个可直接运营、可管理、安全可靠的互联网电视OTT-TV/IPTV平台
- 搭建一个可直接运营、可管理、安全可靠的互联网电视OTT-TV/IPTV平台
- 史上最全最完整栈应用 C语言 源代码 可直接运行
- 易懂易用的MD5加密(可直接运行)
- 易懂易用的MD5加密(可直接运行)
- 用jsp做个有彩纹的随机码,----可直接生成
- 易懂易用的MD5加密(可直接运行)
- 多附件的上传下载--代码可直接用
- FlycoDialog 可直接用的三方Dialog
- 一个分组查询的SQL 常用算法(附源码可直接执行)
- 一个分组查询的SQL 常用算法(附源码可直接执行)
- 一个分组查询的SQL 常用算法(附源码可直接执行)
- 一个虽然复杂但可直接套用的线程池实例
- 想要更改一个数据中的某一位的状态时可使用异或直接操作
- 网站被百度惩罚应从哪些方面分析
- JavaScript中的nodeName nodeType nodeValue区别
- 生育 晚育津贴
- 网站关停之后SEO资源怎么办?
- 初识hash
- 一个可直接用的赫夫曼源代码
- Linux网络编程:gethostbyname()的应用
- 全国213个5A景区(截至2016年01月01日)
- Windws OS 一些概念
- spring基础学习之IoC-资源访问(五)
- Linux网络编程:TCP服务器(多进程)
- Codeforces Round #242 (Div. 2) (A、B、C)
- Timus 1723. Sandro's Book 题解
- Spring AOP(二、注解配置实现)