資源簡介
通過查詢文件中的字符以及各個(gè)字符的權(quán)值(出現(xiàn)次數(shù)),對(duì)某個(gè)字符串進(jìn)行哈夫曼編碼和解碼,代碼則會(huì)通過生成哈夫曼二叉樹計(jì)算出各個(gè)字符的編碼,存在一個(gè)文件中,這時(shí)輸入要編碼的字符串就可以得到其哈夫曼編碼,還可以反向?qū)?1數(shù)據(jù)傳解碼。
代碼片段和文件信息
#include
#include
#include
#include
#define?MAXNUM?60
??
typedef?struct
{??
????char?ch;
????int?weight;?//權(quán)值,這個(gè)字符出現(xiàn)的頻率
????int?parent;
????int?left;
????int?right;
}HuffNode;
??
typedef?struct
{
????char?code[MAXNUM];
????int?start;
}HuffCode;
??
HuffNode?ht[MAXNUM*2];?//存放哈夫曼樹
??
HuffCode?hcd[MAXNUM];??//存放ht數(shù)組中對(duì)應(yīng)的字符的編碼
??
int?n;?????????????????//字符的個(gè)數(shù)
??
//初始化哈夫曼樹ht
void?initHt()
{
????FILE?*?fp;
????char?ch;
????int?i=0;
????//從文件document/character.txt中讀出要編碼的字符和權(quán)值
????if((fp=fopen(“document/character.txt““r“))==NULL){
????????printf(“can?not?open?the?file?character.txt“);
????????exit(0);
????}
????ht[i].left=ht[i].right=ht[i].parent=-1;
????while((ch=fgetc(fp))!=EOF){
????????if(ch==‘\n‘){
????????????i++;
????????????ht[i].left=ht[i].right=ht[i].parent=-1;
????????}
????????else?if((ch>=‘a(chǎn)‘?&&?ch<=‘z‘)||(ch>=‘A‘?&&?ch<=‘Z‘))
????????????ht[i].ch=ch;
????????else?if(ch>=‘0‘&&ch<=‘9‘)
????????????ht[i].weight=ht[i].weight*10+ch-‘0‘;
????}
????n=i+1;
????if(fclose(fp)){
????????printf(“can?not?close?the?file?character.txt“);
????????exit(0);
????}
}
??
//構(gòu)造哈夫曼樹看成有n棵樹,選擇權(quán)值最小的兩棵樹合并
void?createHuffTree()
{
??
????int?i=0k;
????int?minIminJ;
????int?f=0;
????minI=minJ=-1;?//minI ????for(k=n;k<2*n-1;k++){
????????//尋找ht中權(quán)值最小且無父結(jié)點(diǎn)的兩個(gè)結(jié)點(diǎn)
????????i=0;
????????f=0;
????????while(ht[i].ch!=‘\0‘){
????????????if(ht[i].parent==-1){
????????????????if(f==0){
????????????????????minI=i;
????????????????????f++;
????????????????}else?if(f==1){
????????????????????if(ht[i].weight ????????????????????????minJ=minI;
????????????????????????minI=i;
????????????????????}else
????????????????????????minJ=i;
????????????????????f++;
????????????????}else{
????????????????????if(ht[i].weight ????????????????????????minJ=minI;
????????????????????????minI=i;
????????????????????}else?if(ht[i].weight ????????????????????????minJ=i;
????????????????}
????????????}
????????????i++;
????????}
????????//合并兩個(gè)結(jié)點(diǎn)
????????ht[k].ch=‘#‘;
????????ht[k].left=minI;
????????ht[k].right=minJ;
????????ht[k].weight=ht[minI].weight+ht[minJ].weight;
????????ht[k].parent=-1;
????????ht[minI].parent=ht[minJ].parent=k;
????}
}
??
//將一個(gè)字符串反轉(zhuǎn)
void?reverse(char?*str)
{
????int?ij;
????char?ch;
????for(i=0j=strlen(str)-1;i ????????ch=str[i];
????????str[i]=str[j];
????????str[j]=ch;
????}
}
??
//哈夫曼編碼,通過父節(jié)點(diǎn)從下往上找??
void?createHuffCode()
{
????int?ijlength;
????FILE?*?fp;
????for(i=0;i ????????length=0;
????????j=i;
????????//給每個(gè)字符進(jìn)行編碼
????????while(ht[j].parent!=-1){
????????????if(ht[ht[j].parent].left==j){
????????????????hcd[i].code[length++]=0+‘0‘;
????????????}else
????????????????hcd[i].code[length++]=1+‘0‘;
????????????j=ht[j].parent;
????????}
??
???????
評(píng)論
共有 條評(píng)論