很抱歉,我无法为您提供完整的代码实现。根据您给出的代码框架,这是一个基于字符频率构建哈夫曼树,并输出每个字符的哈夫曼编码的程序。
#include<iostream>
#include<string.h>
#define MAXSIZE 100
using namespace std;
typedef struct
{
int weight; //结点的权值
int parent,lchild,rchild; //结点的双亲、左孩子、右孩子的下标
}HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树
typedef char **HuffmanCode; //定义编码表类型
int Search(char a[], char ch)
{
int len = strlen(a);
for(int i=0; i<len; 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-i-1; 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)
{
int min = INT_MAX;
for (int i = 1; i <= n; ++i)
{
if (HT[i].parent == 0 && HT[i].weight < min)
{
min = HT[i].weight;
s1 = i;
}
}
min = INT_MAX;
for (int i = 1; i <= n; ++i)
{
if (HT[i].parent == 0 && HT[i].weight < min && i != s1)
{
min = HT[i].weight;
s2 = i;
}
}
}
void CreateHuffmanTree(HuffmanTree &HT, int n, int b[])
{
if(n <= 1)
return;
int m = 2 * n - 1; // 哈夫曼树总结点数
HT = new HTNode[m+1];
for(int i=1; i<=n; i++)
{
HT[i].weight = b[i-1];
HT[i].parent = 0;
HT[i].lchild = 0;
HT[i].rchild = 0;
}
for(int i=n+1; i<=m; i++)
{
HT[i].weight = 0;
HT[i].parent = 0;
HT[i].lchild = 0;
HT[i].rchild = 0;
}
for(int i=n+1; i<=m; ++i)
{
int s1, s2;
Select_min(HT, i-1, s1, s2);
HT[s1].parent=HT[s2].parent=i;//建立s1和s2的父节点
HT[s1].weight+=HT[s2].weight;//权值之和作为新节点的权值
HT[s2].parent=i;//修改双亲域
Sort(b, m);
}
}
void CreateHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n)
{
HC = new char*[n+1];
char* cd = new char[n]; // 暂时存储每个字符的编码
for(int i=1; i<=n; ++i)
{
int start = n-1;
int c = i;
int p = HT[i].parent;
while(p != 0)
{
--start;
if(HT[p].lchild == c)
cd[start] = '0';
else
cd[start] = '1';
c = p;
p = HT[p].parent;
}
HC[i] = new char[n-start];
strcpy(HC[i], &cd[start]);
}
delete[] cd;
}
void CharFrequency(char ch[],char a[],int b[],int &j)
{
int len=strlen(ch);
j=0;//初始化数组元素下标
for(int i=0;i<len;i++)//判断输入的字符串是否为空,若为空则停止循环
{//开始处理字符串ch中每个字符
int k=Search(a,ch[i]);
if(k==-1)//找到a[]中没有重复的字符,新增一个出现的字符
{
a[j]=ch[i];//将新字符放入a[]中,j++表明要统计的不同字母数增加了1
b[j++]=1;//与新添加进来的字符对应的词频为1.
}
else//在a[]中找到了相同字母,则把该字母对应b[k++]数值增1
b[k]++;
}
}
void PrintHT(HuffmanTree HT)
{
for(int i=1; i<=m; ++i)
{
cout << "Weight: " << HT[i].weight;
cout << " Parent: " << HT[i].parent;
cout << " lChild: " << HT[i].lchild;
cout << " rChild: " << HT[i].rchild;
cout << endl;
}
}
void PrintHC(HuffmanCode HC, char a[], int j)
{
for(int i=1;i<=j;++i)
cout<<a[i]<<" "<<HC[i]<<endl;//输出每个字符的哈夫曼编码
}
int main()
{
char ch[MAXSIZE]; //存放输入的字符串ch[]
char a[MAXSIZE]; //存放统计词频后的字符集合
int b[MAXSIZE]; //存放与字符集合中每个字符对应的权值
int n = 0;
cout<<"请输入一串字符串:";
cin>>ch;
CharFrequency(ch, a, b, n);
Sort(a,b,n);
HuffmanTree HT;
CreateHuffmanTree(HT, n, b);
PrintHT(HT);
HuffmanCode HC;
CreateHuffmanCode(HT, HC, n);
PrintHC(HC,a,n);
return 0;
}
以上代码是基于给定输入字符串,统计字符频率,构建哈夫曼树,并输出每个字符的哈夫曼编码。请注意,代码可能还需要进一步优化和调试,以满足您的具体需求。
内容由零声教学AI助手提供,问题来源于学员提问




