设计一个利用哈夫曼算法的编码系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

设计一个利用哈夫曼算法的编码系统,重复地显示并处理以下项目,直到选择退出为止。【基本要求】

1) 将权值数据存放在数据文件(文件名为,位于执行程序的当前目录中)

2) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;

3) 编码:利用建好的哈夫曼树生成哈夫曼编码;

4) 输出(1)各个字符的编码;(2)

1111111;;;;;;

#include<>

#include<>

#include<>

#define M 50

#define MAX 1000;

typedef struct

{

int weight;arent=ht[i].lchild=ht[i].rchild=0;

if(i<=n)

ht[i].weight=weight[i];

else

ht[i].weight=0;

}

for(i=1;i

{

m2=m1;

x2=x1;

m1=ht[j].weight;

x1=j;

}

else if((ht[j].weight

{

m2=ht[j].weight;

x2=j;

}

}

k=n+i;

ht[x1].parent=ht[x2].parent=k;

ht[k].weight=m1+m2;

ht[k].lchild=x1;

ht[k].rchild=x2;

}

return ht;

}

void huffmancoding(const int n,HUFFMANCODE hc,HUFFMANTREE ht,char str[])

{

int i,start,child,father;

char *cd;

hc=(HUFFMANCODE)malloc((n+1)*sizeof(char*));arent;father!=0;child=father,fath er=ht[father].parent)/*从叶子结点到根结点求逆向编码*/

if(ht[father].lchild==child)

cd[--start]='0';

else

cd[--start]='1';

hc[i]=(char*)malloc((n-start)*sizeof(char));arent=ht[i].lchild=ht[i].rchi ld=0;

if(i<=n)

ht[i].weight=weight[i];

else

ht[i].weight=0;

}

for(i=1;i

{

m2=m1;

x2=x1;

m1=ht[j].weight;

x1=j;

}

else if((ht[j].weight

{

m2=ht[j].weight;

x2=j;

}

}

k=n+i;

ht[x1].parent=ht[x2].parent=k;

ht[k].weight=m1+m2;

ht[k].lchild=x1;

ht[k].rchild=x2;

}

return ht;

}

void huffmancoding(const int n,HUFFMANCODE hc,HUFFMANTREE ht,char str[])

{

int i,start,child,father;

char *cd;

hc=(HUFFMANCODE)malloc((n+1)*sizeof(char*));arent;father!=0;child=father,fath er=ht[father].parent)/*从叶子结点到根结点求逆向编码*/

if(ht[father].lchild==child)

cd[--start]='0';

else

cd[--start]='1';

hc[i]=(char*)malloc((n-start)*sizeof(char));eight); ht[i].parent=0;

}

for(;i<=2*n-1;i++)

ht[i].parent=ht[i].lchild=ht[i].rchild=0;

for(i=n+1;i<=2*n-1;i++)

{

m1=m2=30000;

s1=s2=0;

for(k=1;k<=i-1;k++)

{

if(ht[k].parent==0 && ht[k].weight

{

m2=m1;

s2=s1;

m1=ht[k].weight;

s1=k;

}

else if(ht[k].parent==0 && ht[k].weight

{

m2=ht[k].weight;

s2=k;

}

}

ht[s1].parent=ht[s2].parent=i;

ht[i].lchild=s1;

ht[i].rchild=s2;

ht[i].weight=ht[s1].weight+ht[s2].weight;

}

for(i=1;i<=n;i++)

{

=n-1;

c=i;

f=ht[i].parent;

while(f)

{

if(ht[f].lchild==c)[]='0';

else []='1';

c=f;

f=ht[f].parent;

}

hcd[i]=d;

相关文档
最新文档