- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
赫夫曼编码课程设计
课程设计报告
设计题目: 求赫夫曼编码
专 业 电子信息科学与技术
班 级 0802
学 生 应俏东
学 号 080802224
完成时间 5月1日
扬州大学物理科学与技术学院
2011 年 春季 学期
题目:求赫夫曼编码
功能:当用户输入字符串中各字符出现的次数时,能返回各字符的赫夫曼编码。可以参考教材p146的算法描述。
分步实施:
1.创建结构体数组以存放各结点的信息
2.对各结点建立赫夫曼树
3.逆向求每个字符的赫夫曼编码
4.输出每个字符的赫夫曼编码
要求:1.界面友好,函数功能要划分好
2.总体设计应画一流程图
3.序要加必要的注释
4.要提供程序测试方案
一:源程序:
#includestdio.h
#includestdlib.h
#includestring.h
typedef struct
{unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;//动态分配数组存储赫夫曼树
typedef char**HuffmanCode;//动态分配数组存储赫夫曼编码表
void Select(HuffmanTree HT,unsigned int i,unsigned int*s1,unsigned int*s2)
//选出无母结点并权值最小的两结点并标记为s1、s2
{unsigned int j,k=1;
while(HT[k].parent)
k++;
{for(j=k+1;j=i;j++)
{while(HT[j].parent)
j++;
if(HT[k].weightHT[j].weight)
k=j;
}
*s1=k;
HT[*s1].parent=i+1;
}
k=1;
while(HT[k].parent)
k++;
{for(j=k+1;j=i;j++)
{while(HT[j].parent)
j++;
if(HT[k].weightHT[j].weight)
k=j;
}
*s2=k;
HT[*s2].parent=i+1;
}
}
void HuffmanCoding(HuffmanTree HT,HuffmanCode HC,unsigned int*w,unsigned int n)
//w存放n个字符的全值(均0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC。
{unsigned int c,f,i,m,s1,s2,start;
char*cd;
HuffmanTree p;
if(n1)return;
m=2*n-1;
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-weight=0,p-parent=0,p-lchild=0,p-rchild=0;
}
for(i=n+1;i=m;++i)//建赫夫曼树
{Select(HT,i-1,s1,s2);
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;//母结点权值为两子结点权值之和
}
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;
else cd[--start]=1;
HC[i]=(char*)malloc((n-start)*sizeof(char));//为第i个字符编码分配空间
文档评论(0)