哈夫曼编码报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验项目:哈夫曼编码
#include
#include
#define MAXWORD 100
typedef struct
{ unsigned int weight;char data;
unsigned int parent,llchild,rrchild;
}HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树typedef char * *HuffmanCode; / /动态分配数组存储哈夫曼编码表typedef struct tnode
{ char ch; //字符
int count; //出现次数
struct tnode *lchild,*rchild;
}BTree,*BT;
int a=0,b=0;int s[MAXWORD];char str[MAXWORD];
void main()
{ int n;int i=0;
HuffmanTree HT;HuffmanCode HC;
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int n);
void DispHCode(HuffmanTree HT,HuffmanCode HC,int n);
void Creatree(BT &p,char c); //Creatree()和InOrderTraverse() void InOrderTraverse(BT p); //利用二叉树统计出现的字符及个数void TTranChar(HuffmanTree HT,HuffmanCode HC,int n);
void Tran(HuffmanTree HT,int n);
printf("请输入要用几种字符:");
scanf("%d",&n);
BT root=NULL;
printf("\n");
printf("请输入字符串:\n");
scanf("%s",str);
while(str[i]!='\0')
{Creatree(root,str[i]);i++;}
printf("字符及出现次数:\n");
InOrderTraverse(root);
printf("\n");
HuffmanCoding(HT,HC,n);
DispHCode(HT,HC,n);
Tran(HT,n);
TTranChar(HT,HC,n);
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int n)
{ // w放n个权值,构造赫夫曼树HT,n个字符编码HC
void select(HuffmanTree t,int i,int &s1,int &s2);
int m,i,s1,s2,start;char *cd;unsigned c,f;
HuffmanTree p;
if(n<=1) return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1;i<=n;++i,++p)
{ (*p).parent=0;
(*p).llchild=0;
(*p).rrchild=0;
}
for(p=HT+1,i=0;i { (*p).data=str[i]; (*p).weight=s[i]; } for(;i<=m;++i,++p) (*p).parent=0; for(i=n+1;i<=m;++i) // 建赫夫曼树 { // 在HT[1~i-1]中选择parent为0且weight最小的两个,分别s1、s2 select(HT,i-1,s1,s2); HT[s1].parent=HT[s2].parent=i; HT[i].llchild=s1; HT[i].rrchild=s2; HT[i].weight=HT[s1].weight+HT[s2].weight; } HC=(HuffmanCode)malloc((n+1)*sizeof(char*));//([0]不用) 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].llchild==c) cd[--start]='0'; else cd[--start]='1'; HC[i]=(char*)malloc((n-start)*sizeof(char)); strcpy(HC[i],&cd[start]); // 复制 } free(cd); } void select(HuffmanTree t,int i,int &s1,int &s2) // s1为较小 { int min(HuffmanTree t,int i); int j; s1=min(t,i); s2=min(t,i); if(s1>s2) {j=s1; s1=s2; s2=j; } } int min(HuffmanTree t,int i) // 函数void select()调用 { int j,flag; unsigned int k=100; // 取k比任何权值都大 for(j=1;j<=i;j++) if(t[j].weight