部分源码:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define M 8 typedef struct{ char data; int weight; int parent,lchlid,rchlid; }HTNode,*HuffmanTree; int InitHTNode(HuffmanTree &HT,char da[],int w[]); int CreateTree(HuffmanTree &HT); int Select(HuffmanTree &HT,int& index,int cout); int CodeTree(HuffmanTree &HT,char code[][M]); int DeCodeTree(HuffmanTree &HT,char decode[]); int InitHTNode(HuffmanTree &HT,char da[],int w[]){ int l=strlen(da); int m=2*l; HT=new HTNode[m]; for(int i=1;i<m;i++){ if(i<=l){ HT[i].data=da[i-1]; HT[i].weight=w[i-1]; HT[i].parent=0; HT[i].lchlid=0; HT[i].rchlid=0; }else{ HT[i].data=' '; HT[i].weight=0; HT[i].parent=0; HT[i].lchlid=0; HT[i].rchlid=0; } } } int CreateTree(HuffmanTree &HT){ int index; int cout; for(int i=M+1;i<2*M;i++){ cout=i; Select(HT,index,cout);//left HT[i].lchlid=index; HT[index].parent=i; HT[i].weight+=HT[index].weight; Select(HT,index,cout);//right HT[i].rchlid=index; HT[index].parent=i; HT[i].weight+=HT[index].weight; } } int Select(HuffmanTree &HT,int& index,int cout){ int w=100; for(int i=1;i<cout;i++){ if(HT[i].parent==0 && HT[i].weight!=0){ if(HT[i].weight<w){ index=i; w=HT[i].weight; } } } } int CodeTree(HuffmanTree &HT,char code[][M]){ int p,c; for(int i=1;i<=M;i++){ p=HT[i].parent; c=i; int cout=0; while(p!=0){ if(HT[p].lchlid==c){ code[i-1][cout]='0'; } if(HT[p].rchlid==c){ code[i-1][cout]='1'; } c=p; p=HT[p].parent; cout++; } } } int DeCodeTree(HuffmanTree &HT,char decode[]){ int l=strlen(decode); int index=2*M-1; for(int i=0;i<l;i++){ if(decode[i]=='0'){ index=HT[index].lchlid; if(HT[index].lchlid==0&&HT[index].rchlid==0){ printf("%c",HT[index].data); index=2*M-1; } } else{ index=HT[index].rchlid; if(HT[index].lchlid==0&&HT[index].rchlid==0){ printf("%c",HT[index].data); index=2*M-1; } } } };
注意这里仅为部分代码。没有main主函数 获取源码请关注“值南针”微信公众号:可用电脑微信关注或手机关注(要最新版微信pc端)。在电脑方便。直接下载源码。
点击想要的算法
点击下载直接就可以用的。