课程设计哈夫曼编码Word下载.docx
- 文档编号:19265552
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:36
- 大小:319.81KB
课程设计哈夫曼编码Word下载.docx
《课程设计哈夫曼编码Word下载.docx》由会员分享,可在线阅读,更多相关《课程设计哈夫曼编码Word下载.docx(36页珍藏版)》请在冰豆网上搜索。
编码(Encoding)。
利用已建好的哈夫曼树(如不在内存,则从文件hfmTree.txt中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
3)D:
译码(Decoding)。
利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。
4)P:
打印代码文件(Print)。
将文件CodeFile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrin中。
5)T:
打印哈夫曼树(TreePrinting)。
将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中
5、概要设计
1、系统结构功能图
2各个模块功能的详细描述
intreaData(mytyped[])//载入数据
intreaHFData(HuffMd[])//从hfmTree.txt文件读取数据
intprintData(mytyped[])//数据显示字符频度
intprintHFData(HuffMd[])//显示哈夫曼树字符编码
intsort(mytyped[])//对数据频度大小排序建哈夫曼树时调用
intsortHMC(HuffMd[])//对哈夫曼树字符排序译码文件时调用
intsort1(bitree*temp[N],intn)//对新的数据重新频度大小排序建树时调用
bitree*createbt(mytyped[])//建哈夫曼树
bitree*destroybt(bitree*head)//销毁哈夫曼树,释放空间递归调用
voidHuffManCoding(bitree*BT,intlen,FILE*fp)//哈夫曼树编码利用static函数并写入文件
intprintHuffManfile()//输出哈夫曼树字符频度编码
intEncoding(HuffMd[])//编码
intDecoding(HuffMd[])//编码
voidPrintCodeFile()
voidPreOrderPrint(bitree*HT)
6、详细设计
1详细代码
a)头文件
#include"
stdio.h"
string.h"
#defineN30
typedefstructhm{
charch;
charcode[20];
}HuffM;
typedefstructs{
intfrq;
}mytype;
typedefstructbt{
structbt*lchild;
mytypedt;
structbt*rchild;
}bitree;
intg_flag=0;
intEncoding(HuffMd[]);
intPreOrderPrint(bitree*HT);
voidPrintCodeFile();
intDecoding(HuffMd[]);
b)主函数
myhead.h"
intreaData(mytyped[])//载入数据
{
FILE*fp;
inti=0;
fp=fopen("
data.txt"
"
r"
);
if(NULL==fp)
{
return-1;
}
while(!
feof(fp))
fscanf(fp,"
%c"
&
(d[i].ch));
%d"
(d[i].frq));
fseek(fp,2,SEEK_CUR);
i++;
if(i==N-2)
break;
g_flag=1;
fclose(fp);
return0;
}
intreaHFData(HuffMd[])//从hfmTree.txt文件读取数据
inti=0,td;
charc,data[20];
hfmTree.txt"
printf("
打开哈夫曼编码数据文件出错。
\n"
while
(1)
%c%d%s"
c,&
td,data);
if(feof(fp))
//printf("
%c\t%d\t%s\n"
c,td,data);
d[i].ch=c;
strcpy(d[i].code,data);
=
intprintData(mytyped[])//数据显示字符频度
if(g_flag<
1)
请先载入数据文件。
return0;
for(;
i<
N-3;
i++)
%c\t%d\n"
d[i].ch,d[i].frq);
intprintHFData(HuffMd[])//显示哈夫曼树字符编码
%c\t%s\n"
d[i].ch,d[i].code);
intsort(mytyped[])//对数据频度大小排序建哈夫曼树时调用
inti,j;
mytypetemp;
for(i=0;
N-4;
for(j=0;
j<
N-4-i;
j++)
{
if(d[j].frq>
d[j+1].frq)
{
temp=d[j];
d[j]=d[j+1];
d[j+1]=temp;
}
}
intsortHMC(HuffMd[])//对哈夫曼树字符排序译码文件时调用
HuffMtemp;
if(d[j].ch>
d[j+1].ch)
intsort1(bitree*temp[N],intn)//对新的数据重新频度大小排序建树时调用
bitree*tmp;
n-1;
n-1-i;
if(temp[N-3-n+j]->
dt.frq>
temp[N-3-n+j+1]->
dt.frq)
tmp=temp[N-3-n+j];
temp[N-3-n+j]=temp[N-3-n+j+1];
temp[N-3-n+j+1]=tmp;
bitree*createbt(mytyped[])//建哈夫曼树
bitree*head=NULL;
bitree*temp[N]={NULL};
sort(d);
while(i<
N-3)
temp[i]=(bitree*)malloc(sizeof(bitree));
temp[i]->
dt=d[i];
lchild=NULL;
rchild=NULL;
i=0;
N-4)
head=(bitree*)malloc(sizeof(bitree));
head->
dt.ch='
*'
;
dt.frq=temp[i]->
dt.frq+temp[i+1]->
dt.frq;
lchild=temp[i];
rchild=temp[i+1];
temp[i+1]=head;
temp[i]=NULL;
sort1(temp,N-i-4);
g_flag=11;
returnhead;
bitree*destroybt(bitree*head)//销毁哈夫曼树,释放空间递归调用
bitree*temp;
if(head==NULL)
returnNULL;
temp=head;
if(head->
lchild)
lchild=destroybt(temp->
lchild);
rchild)
rchild=destroybt(temp->
rchild);
free(head);
head=NULL;
returnNULL;
voidHuffManCoding(bitree*BT,intlen,FILE*fp)//哈夫曼树编码利用static函数并写入文件
staticinta[10];
inti;
11)
请先建立哈夫曼树。
if(BT!
=NULL){
if(BT->
lchild==NULL&
&
BT->
rchild==NULL){
//printf("
字符%c的权值为%d的编码:
"
BT->
dt.ch,BT->
dt.frq);
fprintf(fp,"
%c\t%d\t"
for(i=0;
len;
//printf("
%d"
a[i]);
fprintf(fp,"
else{
a[len]=0;
HuffManCoding(BT->
lchild,len+1,fp);
a[len]=1;
rchild,len+1,fp);
}
intmenu()
intn;
printf("
*****************************\n"
字符集和频度操作:
\t1.载入数据文件。
\t2.显示数据。
\t3.排序。
哈夫曼树操作:
\t4.建立哈夫曼树。
\t5.写入哈夫曼编码文件。
\t6.显示哈夫曼编码文件。
\t7.销毁哈夫曼树。
哈夫曼编译码操作:
\t8.载入哈夫曼编码。
\t9.显示哈夫曼编码。
\t10.编码ToBeTran文件.\n"
\t11.译码CodeFile文件.\n"
printf("
\t12.打印CodeFile文件.\n"
\t13.打印哈夫曼树.\n"
\t14.退出\n"
请输入选择:
scanf("
n);
if(n>
0&
n<
15)
输入错误,请重输:
system("
cls"
returnn;
intprintHuffManfile()//输出哈夫曼树字符频度编码
chardata[50],c;
intd;
打开文件哈夫曼编码错误。
d,data);
c,d,data);
main()
mytypedata[N]={0};
HuffMhmdata[N]={0};
intflag;
intchoose,count;
FILE*fp;
bitree*bthead=NULL;
count=0;
g_flag=0;
//刚开始时数据为空。
choose=menu();
switch(choose)
case1:
flag=reaData(data);
if(-1==flag)
printf("
Opendata.txtfileerror!
return;
case2:
printData(data);
case3:
sort(data);
case4:
bthead=createbt(data);
case5:
fp=fopen("
w+"
if(NULL==fp)
写入哈夫曼编码错误!
HuffManCoding(bthead,0,fp);
g_flag=111;
fclose(fp);
case6:
printHuffManfile();
case7:
if(g_flag<
break;
bthead=destroybt(bthead);
g_flag=1;
case8:
flag=reaHFData(hmdata);
sortHMC(hmdata);
case9:
printHFData(hmdata);
case10:
Encoding(hmdata);
case11:
Decoding(hmdata);
case12:
PrintCodeFile();
break;
case13:
PreOrderPrint(bthead,count);
case14:
destroybt(bthead);
return0;
intEncoding(HuffMd[])//编码
FILE*fp,*pfc;
chardata[256]={0},c;
ToBeTran.txt"
pfc=fopen("
CodeFile.txt"
打开文件ToBeTran.txt出错,编码未完成.\n"
if(NULL==pfc)
fclose(fp);
CodeFile.txt出错,编码未完成.\n"
fread(&
c,1,1,fp);
if(c>
='
a'
c<
z'
)
c-=32;
A'
Z'
%s"
d[c-'
+1].code);
fprintf(pfc,"
elseif(c=='
'
d[0].code);
else
c);
fclose(pfc);
intDecoding(HuffMd[])//编码
FILE*fp,*pfc;
chardata[20]={0},c;
inti;
//,flag
fp=fopen("
"
pfc=fopen("
TextFile.txt"
if(NULL==fp)
printf("
打开文件ToBeTran.txt出错,译码未完成.\n"
return-1;
if(NULL==pfc)
TextFile.txt出错,译码未完成.\n"
while
(1)
fread(&
c,1,1,fp);
if(c=='
1'
||c=='
0'
//return1;
for(i=0;
27;
{
data[i]=c;
while(strcmp(d[i].code,data)==0)
fprintf(pfc,"
d[i].ch);
}
else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 哈夫曼 编码