哈夫曼编码

哪位神牛知道哈夫曼编码的算法?!
急用!谢谢!!
(Pascal的)

希望这个可以帮到你,我刚做完课程设计,做的就是哈弗曼便译码器,有问题可以问我!
//******************初始化函数*********************
//函数功能: 从终端读入字符集大小n , 以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中
//函数参数:
//向量HT的前n个分量表示叶子结点,最后一个分量表示根结点,各字符的编码长度不等,所以按实际长度动态分配空间
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)//w存放n个字符的权值(均>0),构造哈夫曼树HT,并求出n个字符的哈弗曼编码HC
{
if(n<=1) return;
m=2*n-1;//m为结点数,一棵有n个叶子结点的哈夫曼树共有2n-1个结点,可以存储在一个大小为2n-1的一维数组中
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));//0号单元未用
//--------初始化哈弗曼树-------
for(p=HT+1,i=1;i<=n;i++,p++,w++)
*p={*w,0,0,0,0}
for(;i<=m;i++,p++)
*p={0,0,0,0,0}
//--------建哈夫曼树-------------
for(i=n+1;i<=m;i++)
{
Select(HT,i-1,s1,s2);//在HT[1...i-1]选择parent为0且weight最小的两个结点,其序号分别为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;
}
//-------从叶子到根逆向求每个字符的哈弗曼编码--------
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));//指针数组:分配n个字符编码的头指针向量
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';//判断是左孩子还是右孩子(左为0右为1)
else cd[--start]='1';
HC[i]=(char*)malloc((n-start)*sizeof(char));//按所需长度分配空间
strcpy(HC[i],&cd[start]);//从cd复制编码串到HC
}
free(cd);
}追问

你能用Pascal解决这个问题吗?

追答

呵呵,我还没学过哪种语言,爱莫能助啊

温馨提示:答案为网友推荐,仅供参考
第2个回答  2020-11-26
相似回答