用哈夫曼编码实现文件压缩实验报告管理资料Word文档格式.docx
- 文档编号:16799171
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:17
- 大小:238.66KB
用哈夫曼编码实现文件压缩实验报告管理资料Word文档格式.docx
《用哈夫曼编码实现文件压缩实验报告管理资料Word文档格式.docx》由会员分享,可在线阅读,更多相关《用哈夫曼编码实现文件压缩实验报告管理资料Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
根据字符出现频率编码,使电文总长最短
编码:
根据字符出现频率构造Huffman树,然后将树中结点引向其左孩子的分支标“0”,引向其右孩子的分支标“1”;
每个字符的编码即为从根到每个叶子的路径上得到的0、1序列。
(3)文本编码
读取存放在文本中的字母,一对一的进行编译,将对应的编码存放到另一个文本中。
六、详细设计:
#include<
>
//树结点定义
typedefstruct
{
intweight;
intparent;
intlchild;
intrchild;
}HTNode,*HuffmanTree;
staticcharN[100];
//用于保存字符
//赫夫曼编码,char型二级指针
typedefchar**HuffmanCode;
//封装最小权结点和次小权结点
ints1;
ints2;
}MinCode;
//函数声明
voidError();
HuffmanCodeHuffmanCoding(HuffmanTree&
HT,HuffmanCodeHC,int*w,intn);
MinCodeSelect(HuffmanTreeHT,intn);
//当输入1个结点时的错误提示
voidError()
printf("
一个字符不进行编码!
\n"
);
exit
(1);
}
//构造赫夫曼HT,编码存放在HC中,w为权值,n为结点个数
HT,HuffmanCodeHC,int*w,intn)
inti,s1=0,s2=0;
HuffmanTreep;
char*cd;
intf,c,start,m;
MinCodemin;
if(n<
=1)
{
Error();
//只有一个结点不进行编码,直接exit
(1)退出
}
m=2*n-1;
//赫夫曼码需要开辟的结点大小为2n-1
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
//开辟赫夫曼树结点空间m+1
//初始化n个叶子结点
for(p=HT,i=0;
i<
=n;
i++,p++,w++)
p->
weight=*w;
parent=0;
lchild=0;
rchild=0;
//将n-1个非叶子结点的初始化
for(;
=m;
i++,p++)
weight=0;
//构造赫夫曼树
for(i=n+1;
i++)
min=Select(HT,i-1);
//找出最小和次小的两个结点
s1=;
//最小结点下标
s2=;
//次小结点下标
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
//赋权和
//打印赫夫曼树
HTList:
Number\t\tweight\t\tparent\t\tlchild\t\trchild\n"
for(i=1;
%d\t\t%d\t\t%d\t\t%d\t\t%d\t\n"
i,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
//从叶子结点到根节点求每个字符的赫夫曼编码
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
cd=(char*)malloc(n*sizeof(char*));
//为赫夫曼编码动态分配空间
cd[n-1]='
\0'
;
//编码结束符
//求叶子结点的赫夫曼编码
start=n-1;
//定义左子树为0,右子树为1
/*
从最下面的1号节点开始往顶部编码(逆序存放),然后编码2号节点,3号......
*/
for(c=i,f=HT[i].parent;
f!
=0;
c=f,f=HT[f].parent)
if(HT[f].lchild==c)
cd[--start]='
0'
else
1'
//为第i个字符分配编码空间
HC[i]=(char*)malloc((n-start)*sizeof(char*));
//将当前求出结点的赫夫曼编码复制到HC
strcpy(HC[i],&
cd[start]);
free(cd);
returnHC;
MinCodeSelect(HuffmanTreeHT,intn)
intmin,secmin;
inttemp=0;
inti,s1,s2,tempi=0;
MinCodecode;
s1=1;
s2=1;
min=999999;
//足够大
//找出权值weight最小的结点,下标保存在s1中
if(HT[i].weight<
min&
&
HT[i].parent==0)
min=HT[i].weight;
s1=i;
secmin=999999;
//找出权值weight次小的结点,下标保存在s2中
if((HT[i].weight<
secmin)&
(i!
=s1)&
secmin=HT[i].weight;
s2=i;
//放进封装中
=s1;
=s2;
returncode;
}
voidCompression(HuffmanCodeHC)//翻译原文档字符为赫夫曼编码
{
FILE*fp1,*fp2;
charch;
if((fp1=fopen("
"
"
r"
))==NULL)
exit(0);
if((fp2=fopen("
a"
ch=fgetc(fp1);
while((int)ch!
=-1)
{
switch(ch)
case'
a'
:
fputs(HC[1],fp2);
break;
b'
fputs(HC[2],fp2);
c'
fputs(HC[3],fp2);
d'
fputs(HC[4],fp2);
e'
fputs(HC[5],fp2);
f'
fputs(HC[6],fp2);
g'
fputs(HC[7],fp2);
h'
fputs(HC[8],fp2);
i'
fputs(HC[9],fp2);
j'
fputs(HC[10],fp2);
k'
fputs(HC[11],fp2);
l'
fputs(HC[12],fp2);
m'
fputs(HC[13],fp2);
n'
fputs(HC[14],fp2);
o'
fputs(HC[15],fp2);
p'
fputs(HC[16],fp2);
q'
fputs(HC[17],fp2);
r'
fputs(HC[18],fp2);
s'
fputs(HC[19],fp2);
t'
fputs(HC[20],fp2);
u'
fputs(HC[21],fp2);
v'
fputs(HC[22],fp2);
w'
fputs(HC[23],fp2);
x'
fputs(HC[24],fp2);
y'
fputs(HC[25],fp2);
z'
fputs(HC[26],fp2);
default:
没有编码!
}
fclose(fp1);
fclose(fp2);
voidmain()
HuffmanTreeHT=NULL;
HuffmanCodeHC=NULL;
int*w=NULL;
inti,n;
输入字符:
gets(N);
n=strlen(N);
w=(int*)malloc((n+1)*sizeof(int*));
//开辟n+1个长度的int指针空间
w[0]=0;
输入结点权值:
//输入结点权值
w[%d]="
i);
scanf("
%d"
&
w[i]);
//构造赫夫曼树HT,编码存放在HC中,w为权值,n为结点个数
HC=HuffmanCoding(HT,HC,w,n);
//输出赫夫曼编码
赫夫曼:
Number\t\tWeight\t\tCode\n"
%c\t\t%d\t\t%s\n"
N[i-1],w[i],HC[i]);
Compression(HC);
选取权值最小的结点的算法:
选取权值次小的结点的算法:
哈夫曼树建立的算法:
开始
读入n,S1,S2的值
i=n+1
=2n-1
否
是
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
i++
输出S1的值
结束
哈夫曼编码的算法:
读入n
i=1
=n
start=1
c=i
f=HT[i].parent
f!
=0
HT[f].lchild==c
否
cd[--start]='
输出cd的值
七、测试结果及分析:
4.输出哈夫曼树:
5.字符对应编码:
6.要编码的文本:
7.编译后的文本:
八、教师评语:
教师评价
评定项目
A
B
C
D
算法正确
界面美观,布局合理
程序结构合理
操作熟练
语法、语义正确
解析完整
实验结果正确
文字流畅
报告规范
题解正确
其他:
评价教师签名:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 用哈夫曼 编码 实现 文件 压缩 实验 报告 管理 资料