文档详情

哈夫曼编码解码实验报告.docx

发布:2017-04-18约3.59千字共14页下载文档
文本预览下载声明
哈夫曼编码解码实验 实验要求 掌握二叉树的相关概念 掌握构造哈夫曼树,进行哈夫曼编码。 对编码内容通过哈夫曼树进行解码。 实验内容 通过二叉树构造哈夫曼树,并用哈夫曼树对读取的txt文件进行哈夫曼编码。编码完成后通过哈夫曼树进行解码。 #includestdio.h #includestring.h #define MAX 100 //定义哈夫曼树的存储结构 typedef struct { char data; int weight; int parent; int lch; int rch; }HuffNode; //定义哈夫曼编码的存储结构 typedef struct { char bit[MAX]; int start; }HuffCode; HuffNode ht[2*MAX]; HuffCode hcd[MAX]; int Coun[127]={0}; int n; char s1[200000]; char text[5000]; //构造哈夫曼树 void HuffmanTree() { int i,j,k,left,right,min1,min2; //printf(输入叶子的节点数:); //scanf(%d,n); printf(字符数量=%d\n,n); for(i=1;i=2*n-1;i++) { ht[i].parent=ht[i].lch=ht[i].rch=0; } j=0; for(i=1;i=n;i++) { /*getchar(); printf(输入第%d个叶子节点的值:,i); scanf(%c,ht[i].data); printf(输入该节点的权值:); scanf(%d,ht[i].weight); */ for(;j127;j++) { if(Coun[j]!=0) { ht[i].data=j; //printf(%c,ht[i].data); ht[i].weight=Coun[j]; //printf(%d,ht[i].weight); break; } } j++; } printf(\n); for(i=1;i=n;i++) { printf(%c,ht[i].data); } printf(\n); for(i=n+1;i=2*n-1;i++) {//在前n个结点中选取权值最小的两个结点构成一颗二叉树 min1=min2=10000;//为min1和min2设置一个比所有权值都大的值 left=right=0; for(k=1;k=i-1;k++) { if(ht[k].parent==0)//若是根结点 //令min1和min2为最小的两个权值,left和right为权值最小的两个结点位置 if(ht[k].weightmin1) { min2=min1; right=left; min1=ht[k].weight; left=k; } else if (ht[k].weightmin2) { min2=ht[k].weight; right=k; } } ht[left].parent=i; ht[right].parent=i; ht[i].weight=ht[left].weight+ht[right].weight; ht[i].lch=left; ht[i].rch =right; } } //构造哈夫曼编码 void HuffmanCode() { int i,c,k,f; HuffCode cd; for(i=1;i=n;i++) { cd.start=n; c=i; f=ht[i].parent; while(f!=0) { if(ht[f].lch==c) cd.bit[cd.start]=0; else cd.bit[cd.start]=1; cd.start--; c=f; f=ht[f].parent; } hcd[i]=cd; } printf(输出哈夫曼编码:\n); for(i=1;i=n;i++) { printf(%c:,ht[i].data); for(k=hcd[i].start+1;k=n;k++) printf(%c,hcd[i].bi
显示全部
相似文档