- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
#include stdio.h /*I/O函数*/
#includestdlib.h /*其他库函数声明*/
int num;/*记录结点数*/
int codenum=0;/*已经获得的编码个数*/
char filename[20]=; /*存储文件名*/
typedef struct /*哈夫曼结点存储结构*/
{
char ch; /*结点字符*/
int w; /*结点权值*/
int lchild,rchild; /*左右孩子的数组下标*/
}HafuNode,*HafuTree;
HafuTree ht;/*声明一个指向树结点到指针*/
typedef struct
{
char ch; /*叶子结点字符*/
char codestr[20]; /*字符编码*/
}HafuCode;
HafuCode code[27];/*用于存放对应字符到哈夫曼编码*/
void InitHafuArry()
{ /*导入文件计算权值,生成只含有叶子结点的HafuNode数组*/
int j,i,k;
HafuNode tmpht;
FILE *fp; /*定义一指向打开文件的指针*/
char ch;/*用于存储一个字母*/
char location[30]=D:\\;
ht=(HafuTree)malloc(53*sizeof(HafuNode)); /*为哈夫曼数分配内存空间*/
if(ht==NULL) return ;
for(i=0;i53;i++) /*初始化所以的数据单元,每个单元自成一棵树*/
{
ht[i].w=0; /*权值初始化为0*/
ht[i].lchild=ht[i].rchild=-1; /*左右子为空*/
}
num=0;
printf(File name:);
scanf(%s,filename);
strcat(location,filename);
fp=fopen(location,r);
if(!fp) /*返回1时即存在文件*/
{
printf(Open Error);
return;
}
while(!feof(fp))/*没到结尾时返回0*/
{
ch=fgetc(fp);
if(ch== ||ch=zch=a||ch=Zch=A)
{
printf(%c,ch);
if(ch== ) ch=#;
for(j=0;jnum;j++)
{
if(ht[j].ch==ch)
{
break;
}
}
if(j==num) /*找到新字符*/
{
ht[num].ch=ch; /*将新字符存入并将权值加1*/
ht[num].w++;
num++;
}
else
{
ht[j].w++; /*将已有字符权值加1*/
}
}
}fclose(fp);
printf(\n);
for(i=0;inum;i++) /*对叶子结点按权值进行升序排序*/
{
k=i;
for(j=i+1;jnum;j++)
{
if(ht[j].wht[k].w)/*如果后面发现权值比i小的则将其下标记录下来,循环完之后找到最小的*/
k=j;
}
if(k!=i) /*如果权值最小的不是第i个元素则交换位置,将小的放到前面*/
{
tmpht=ht[i];
ht[i]=ht[k];
ht[k]=tmpht;
}
}
}
int CreateHafuman(HafuTree ht)
{ /*在数组ht中生成哈夫曼数,返回根节点下标*/
int i,k,j,root;
HafuNode hfnode;
codenum=0;
for(i=0;inum-1;i++)
{ /*需生成num-1个结点*/
k=2*i+1; /*每次取最前面两个结点,其权值必定最小*/
hfnode.w=ht[k].w+ht[k-1].w;
hfnode.lchild=k-1;
hfnode.rchild=k;
for(j
文档评论(0)