一个关于哈夫曼编码的问题,运行结果不正确,看了好几天了,不知道哪里有问题。
输入一个英文字符串,对该字符串中各字符个数进行统计取得各字符的出现次数;以其出现次数作为关键字建立哈夫曼树并进行编码,最后输出各个字符对应的码值。#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 30
/*记录字符串的数据结构*/
typedef struct
{
int len;
char *string; //需要记录的字符串
char elem[MAXSIZE]; //该字符串所拥有的元素
int count[MAXSIZE]; //该字符串相应元素的个数
}record;
/*哈夫曼树的数据结构*/
typedef struct
{
int weight; //用来存放各个结点的权值
int parent; //指向双亲,孩子结点的指针
int LChild;
int RChild;
}HTNode,*HuffmanTree; //动态分配数组,存储哈弗曼树
typedef char**HuffmanCode; //动态分配数组,存储哈夫曼编码
void swap(int *x,int *y)
{
int temp=*x;
*x=*y;
*y=temp;
}
void select(HuffmanTree *ht,int n,int *s1,int *s2)
{
int min1=(*ht)[1].weight,min2=(*ht)[2].weight;
*s1=1,*s2=2;
if(min1>min2)
{
*s1=2;
*s2=1;
swap(&min1,&min2);
}
for(int i=3;i<=n;i++)
{
if((*ht)[i].weight<min1)
{
min2=min1;
min1=(*ht)[i].weight;
*s2=*s1;
*s1=i;
}
else if((*ht)[i].weight<min2)
{
min2=(*ht)[i].weight;
*s2=i;
}
}
}
void CrtHuffmanTree(HuffmanTree *ht,HuffmanCode *hc,int *w,int n)
{
int m,i,s1,s2,start,c,p;
char *cd;
m=2*n-1;
*ht=(HTNode *)malloc((m+1)*sizeof(HTNode));
for(i=1;i<=n;i++)
{
(*ht)[i].weight=w[i];
(*ht)[i].LChild=0;
(*ht)[i].parent=0;
(*ht)[i].RChild=0;
}
for(i=n+1;i<=m;i++)
{
(*ht)[i].LChild=0;
(*ht)[i].parent=0;
(*ht)[i].RChild=0;
(*ht)[i].weight=0;
}
for(i=n+1;i<=m;i++)
{
select(ht,i-1,&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 *));
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;i++)
{
start=n-1;
for(c=i,p=(*ht)[i].parent;p!=0;c=p,p=(*ht)[p].parent)
if((*ht)[p].LChild==c)
cd[--start]='0';
else
cd[--start]='1';
(*hc)[i]=(char *)malloc((n-start)*sizeof(char));
strcpy((*hc)[i],&cd[start]);
}
free(cd);
}
void trans(record *s,char *p)
{
int i=0,k=0,j,flag=0;
s->len=0;
while(*(p+i)!='\0')
{
for(j=1;j<=k;j++)
{
flag=0;
if(*(p+i)==s->elem[j])
{
flag=1;
s->count[j]++;
break;
}
}
if(flag==0)
{
k++;
s->len++;
s->elem[k]=*(p+i);
s->count[k]=1;
}
i++;
}
}
int main()
{
char a[20]="abbcccdddd";
record s;
HuffmanTree ht;
char ** hc;
trans(&s,a);
CrtHuffmanTree(&ht,&hc,s.count,s.len);
printf("%s\n",*(hc+1));
return 0;
}