请教哈夫曼树编码问题

zh409754882 2005-11-20 10:54:36
请大家帮我看一下我的程序有什么问题 谢谢大家



#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef struct
{
char data;
unsigned weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree; //动态分配数组存储赫夫曼树

typedef char **HuffmanCode; //动态分配数组存储赫夫曼编码表

void HuffmanCoding();
void select(HuffmanTree,int ,int *,int *);

void main()
{
HuffmanCoding();
}




void HuffmanCoding()
//d存放n个字符,w存放字符的权值(w>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC
{
HuffmanTree HT;
HuffmanCode HC;
char d;
int w,n;
printf("请输入待编码字符数:\n");
scanf("%d",&n);
if(n<=1)return;
int m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //0号单元未用
int i;
for(i=1;i<=n;++i)
{
printf("请输入待编码字符:\n");
scanf("%c",&d);
printf("请输入字符的相应权值:\n");
scanf("%d",&w);
HT[i].data=d;
HT[i].weight=w;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}

for(i=n+1;i<=m;++i)
{ HT[i].data=0;
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}


//
for(i=n+1;i<=m;++i)
{ //建赫夫曼树,在HT[1...k-1]选择parent为零且weight最小的两个结点,其序号分别为s1和s2
int s1,s2;
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*)); //分配n个字符编码的头指针向量
char*cd=(char*)malloc(n*sizeof(char)); //分配求编码的工作空间
cd[n-1]='\0'; //编码结束符

for(i=1;i<=n;i++)
{ //逐个字符求赫夫曼编码

int start=n-1; //编码结束符位置

for(int k=i,j=HT[i].parent;j!=0;k=j,j=HT[j].parent)
{ //从叶子到根逆向求编码

if(HT[j].lchild==k)
cd[--start]='0';
else cd[--start]='1';
}

HC[i]=(char*)malloc((n-start)*sizeof(char)); //为第i个字符编码分配空间

strcpy(HC[i],&cd[start]); //从cd复制编码到HC

free(cd);//释放工作空间
} //HuffmanCoding


for(i=1;i<=n;++i)
printf("%c的编码是%s",HT[i].data,HC[i]);
}


void select(HuffmanTree ht,int r,int * u1,int * u2)//选择权值最小的两个节点
{
for(int e=1;e<=r-1;e++)
{
if(ht[e].parent)continue;
*u1=e;
for(;e<=r-1;e++)
{
if(ht[e+1].parent==0)
if(ht[*u1].weight>ht[e+1].weight)
*u1=e+1;
ht[*u1].parent=1;
}
break;
}
for(e=1;e<=r-1;e++)
{
if(ht[e].parent)continue;
*u2=e;
for(;e<=r-1;e++)
{
if(ht[e+1].parent==0)
if(ht[*u2].weight>ht[e+1].weight)
*u2=e+1;
}
break;
}
}
...全文
332 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiaolong0127 2005-11-22
  • 打赏
  • 举报
回复
编译、连接通过,只是运行有问题,看来是程序算法出了点问题。
csucdl 2005-11-20
  • 打赏
  • 举报
回复
太长了

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧