设计一个利用哈夫曼算法的编码系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;