| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 940 人关注过本帖
标题:[求助]求助赫夫曼编码的问题
只看楼主 加入收藏
fabio210
Rank: 1
等 级:新手上路
威 望:1
帖 子:58
专家分:0
注 册:2005-11-6
收藏
 问题点数:0 回复次数:2 
[求助]求助赫夫曼编码的问题

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

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

void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)
{//w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC。
//-------------建赫夫曼树--------------------
int i,m,s1,s2,start;
unsigned c,f;
HuffmanTree p;
char *cd; //求编码的工作空间
if(n<=1) return;
m=2*n-1; //共需要m个结点
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //0号单元未用
for(p=HT+1,i=1;i<=n;++i,++p,++w)
{
p->weight=*w;
p->parent=0;
p->lchild=0;
p->rchild=0;
}

for(;i<=m;++i,p++)
p=(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。
printf("s1=%d,s2=%d\n",s1,s2);
HT[s1].parent=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)); //分配求编码的工作空间
//编码结束符
for(i=1;i<=n;++i) //逐个字符求赫夫曼编码
{
start=n-1; //编码结束符位置
cd[n-1]='\0';
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) //从叶子到根逆向求编码
if(HT[f].lchild==c) cd[--start]='0';
else cd[--start]='1';
HC[i]=(char *)malloc((n-start)*sizeof(char)); //为第i个字符编码分配空间
strcpy(HC[i],&cd[start]);
}
free(cd);
}


这个Select(HT,i-1,s1,s2)函数该怎么写?

搜索更多相关主题的帖子: 赫夫曼 编码 
2005-12-28 13:40
fabio210
Rank: 1
等 级:新手上路
威 望:1
帖 子:58
专家分:0
注 册:2005-11-6
收藏
得分:0 
没人帮忙啊,我已经解决了……

2005-12-29 13:03
ペ孩尐気の貓
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-1-5
收藏
得分:0 
怎么解决啊???????帮帮我啊~~~

2006-01-05 15:23
快速回复:[求助]求助赫夫曼编码的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017718 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved