以下是补充代码:
int Search(char a[], char ch) {
for(int i = 0; a[i] != '\0'; i++) {
if(a[i] == ch)
return i;
}
return -1;
}
void Sort(char a[], int b[], int len) {
for(int i = 0; i < len - 1; i++) {
for(int j = 0; j < len - 1 - i; j++) {
if(a[j] > a[j+1]) {
swap(a[j], a[j+1]);
swap(b[j], b[j+1]);
}
}
}
}
void Select_min(HuffmanTree HT, int n, int &s1, int &s2) {
s1 = s2 = -1;
for(int k = 0; k < n; k++) {
if(HT[k].parent == -1 && (s1 == -1 || HT[k].weight < HT[s1].weight)) {
s2 = s1;
s1 = k;
} else if (HT[k].parent == -1 && (s2 == -1 || HT[k].weight < HT[s2].weight)) {
s2 = k;
}
}
}
void CreateHuffmanTree(HuffmanTree &HT, int n, int b[]) {
m = 2 * n - 1;
HT = new HTNode[m];
for(int i = 0; i < m; i++) { // 初始化树的所有节点
if(i < n) {
HT[i].weight=b[i];
} else {
HT[i].weight=0;
}
HT[i].parent=-i-2;//初始设置所有结点的双亲为-2
HT[i].lchild=-1;
HT[i].rchild=-1;
}
for(int i = n; i < m; i++) { // 创建哈夫曼树
int s1, s2;
Select_min(HT, i, 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; // 合并节点,更新权值
}
}
void CreateHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n) {
HC = new char*[n];
char *code = new char[n];
code[n-1] = '\0';
for(int i = 0; i < n; ++i) {
int current = i;
int parent = HT[current].parent;
while(parent != -1) {
if(current == HT[parent].lchild)
code[--n] = '0';
else
code[--n] = '1';
current=parent;//向上回溯
parent=HT[current].parent;
}
HC[i]=new char[strlen(code+ n)];
strcpy(HC[i],code+n);
}
delete[] code; //释放临时空间
}
void PrintHT(HuffmanTree HT) {
cout << "存储结构:" << endl;
for (int k=0;k<m;k++)
{
cout << setw(3) << k << " ";
cout << setw(3) << HT[k].weight<< " ";
cout << setw(3) << HT[k].parent<< " ";
cout << setw(3) << HT[k].lchild<< " ";
cout << setw(3) << HT[k].rchild<< endl;
}
}
void PrintHC(HuffmanCode HC, char a[], int j) {
cout<<"编码表:" << endl;
for (int k=0;k<j;k++)
{
cout<<a[k]<<" : "<<HC[k]<<endl;
}
}
void CharFrequency(char ch[], char a[], int b[], int &j){
int len = strlen(ch);
for(int i=0;i<len;++i)
{
if(Search(a,ch[i]) == -1)
{
a[j]=ch[i];
b[j]++;
++j;
}
else
{
++b[Search(a,ch[i])];
}
}
}
int main() {
char ch[MAXSIZE];
int i,j;
while(cin>>ch)
{
if(ch[0]=='0') break;
HuffmanTree HT;
char a[MAXSIZE]={'\0'};
int b[MAXSIZE]={0};
j=0; //j统计不同字符的数量
CharFrequency(ch,a,b,j); //统计词频
Sort(a,b,j); //按ASCII码冒泡排序
for(i=0;a[i]!='\0';i++) //输出统计出来的字符和出现频率
{
if(a[i+1]!='\0')
cout<<a[i]<<":"<<b[i]<<" ";
else
cout<<a[i]<<":"<<b[i]<<endl;
}
//构造哈夫曼树
CreateHuffmanTree(HT,i,b); //构造哈夫曼树HT
PrintHT(HT); //输出哈夫曼树的存储结构的终态
//哈夫曼编码
HuffmanCode HC; //编码表HC
CreateHuffmanCode(HT, HC, j);
PrintHC(HC, a, j); //输出每个字符的哈夫曼编码
int k;
for(i=0;ch[i]!='\0';i++) //输出编码后的字符串
{
for(k=0;k<j;k++)
{
if(ch[i]==a[k])
cout<<HC[k];
}
}
cout << endl;
cout << ch << endl;//输出解码后的字符串(与输入的字符串相同)
}
return 0;
}
请注意,以上代码是基于给定的补充部分进行修正和完善,但仍然可能存在一些错误或逻辑缺陷。在实际应用中,请根据具体需求进行验证和调整。
内容由零声教学AI助手提供,问题来源于学员提问