哈弗曼编码完整版Word文件下载.docx
《哈弗曼编码完整版Word文件下载.docx》由会员分享,可在线阅读,更多相关《哈弗曼编码完整版Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
#defineMAXSIZE150
#defineMAXSIZE2500
intt,count,num;
uintw[MAXSIZE1];
charc[MAXSIZE1],data[MAXSIZE2];
typedefstruct
{
charch;
unsignedintweight;
unsignedintparent,lchild,rchild;
}HTNode,*HuffmanTree;
typedefchar**HuffmanCode;
/*******************************************************************/
voidStart_Screen()
{
printf("
\n\n"
);
||------------------------------------||\n"
||------------------------------------||"
\n||------------------------------------||\n||||\n||"
\005哈夫曼编译码||\n||||\n||||\n||"
\0061哈夫曼编码||\n||"
\0162显示哈夫曼编码||\n||"
\0163输入文本编译报文||\n||"
\0164输入报文编译文本||\n||"
\0165已有文本编译报文||\n||"
\0166已有报文编译文本||\n||"
\0167退出系统||\n||"
制作人:
邓俊辉||\n||"
------------------------------------||\n"
\016请输入您的选择选择:
"
scanf("
%d"
&
t);
}
//选择权值最小且parent为0的二叉树,返回其序号
intMin(HuffmanTreebt,intm)
inti,temp;
uintk;
for(i=0;
i<
m;
i++)//取k等于首个parent为0的权值
if(bt[i].parent==0)
{
k=bt[i].weight;
temp=i;
break;
}
for(i=i+1;
i++)//逐个与其他权值进行比较,并返回在parent为0下权值最小的序号
if(bt[i].weight<
k&
&
bt[i].parent==0)
{
bt[temp].parent=1;
returntemp;
//在HT[0~i]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2
voidSelect(HuffmanTreeht,intm,uint*s1,uint*s2)
(*s1)=Min(ht,m);
(*s2)=Min(ht,m);
//构造哈夫曼树
voidCreateHuffmanTree(HuffmanTree*HT,intn)
HuffmanTreep;
uints1,s2;
inti,num;
num=2*n-1;
*HT=(HuffmanTree)malloc(num*sizeof(HTNode));
p=*HT;
n;
i++)//由给定的n个权值和字符构造n棵只有一个叶子结点的二叉树;
p->
ch=c[i];
weight=w[i];
parent=0;
lchild=p->
rchild=-1;
//初始化二叉树结点,parent置为0,lchild,rchild均置为-1
p++;
for(i=n;
num;
i++)//构造n-1个空二叉树用于存储新树根结点
ch='
*'
;
i++)
Select(*HT,i,&
s1,&
s2);
(*HT)[s1].parent=(*HT)[s2].parent=i;
(*HT)[i].lchild=s1;
(*HT)[i].rchild=s2;
(*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight;
//从叶子节点到根节点逆向求哈弗曼编码
HuffmanCodeHuffmanCoding(HuffmanTreeHT,intn)
inti,f,top;
uintt;
HuffmanCodeHC;
char*hc;
HC=(HuffmanCode)malloc(n*sizeof(char*));
//动态申请指针存储哈夫曼编码
hc=(char*)malloc(n*sizeof(char));
//申请哈夫曼编码的工作空间
hc[n-1]='
\0'
top=n-1;
t=i;
f=HT[i].parent;
while(f!
=0)
{
if(HT[f].lchild==t)hc[--top]='
0'
elsehc[--top]='
1'
t=f;
f=HT[t].parent;
}
HC[i]=(char*)malloc((n-top)*sizeof(char));
//为已申请的指针分配一维数组存储哈夫曼编码
strcpy(HC[i],&
hc[top]);
free(hc);
returnHC;
//输出哈夫曼树
voidPrintHuffmanTree(HuffmanTreeht,intn)
inti,m;
m=2*n-1;
\t哈夫曼树及哈弗曼编码\n\n"
序号字符权值双亲左孩子右孩子\n"
printf("
%2d%c%5d"
i,ht[i].ch,ht[i].weight);
%5d%5d%5d\n"
ht[i].parent,ht[i].lchild,ht[i].rchild);
//输出哈夫曼编码
voidPrintHuffmanCode(HuffmanTreeht,HuffmanCodehc,intn)
inti;
字符\t哈弗曼编码\n"
%c%s\n"
ht->
ch,hc[i]);
ht++;
\n\n\n\n\n\n\n\n\n"
//将哈夫曼树的初始信息写入文件
voidWriteHuffmanTree()
FILE*fp;
uintwe;
charch;
请输入你需要的字符和权值,用‘#’结束输入:
\n"
if((fp=fopen("
DataFile.data"
"
w"
))==NULL)
\nErroronopen%s!
\a"
exit
(1);
\n%c"
ch);
while(ch!
='
#'
)
scanf("
we);
fprintf(fp,"
%c"
ch);
%5d\n"
we);
ch=getchar();
fclose(fp);
//读哈夫曼树的初始信息
voidReadHuffmanTree()
inti=0;
count=0;
r"
//表示程序非正常退出
while(!
feof(fp))
fscanf(fp,"
c[i]);
if(c[i]=='
\n'
)
continue;
//读到换行符,跳过,读下一行
%5d"
w[i]);
count++;
i++;
//将内容写入文件
voidWriteDataFile(char*fileName)
num=0;
if((fp=fopen(fileName,"
fileName);
num++;
//读文件内容
voidReadDataFile(char*fileName)
if(data[i]=='
)continue;
data[i]);
data[i]='
//编码,用已及建好的哈夫曼树,对所输入的文件进行编码形成报文
voidEnCoding(HuffmanCodehc)
inti=0,j;
请输入您需要进行编码的文本,以‘#’结束:
WriteDataFile("
ToBeTran.data"
ReadDataFile("
Code.txt"
'
)putchar('
for(j=0;
j<
count;
j++)
if(data[i]==c[j])
{
fprintf(fp,"
%s"
hc[j]);
printf("
break;
}
putchar('
//译码,用用已及建好的哈夫曼编码,对所输入的报文进行解译形成文本
voidDeCoding(HuffmanTreeht)
请输入您需要进行解码的代码,以‘#’结束:
CodeFile.data"
TextFile.txt"
p=&
ht[2*count-1-1];
=num;
putchar('
&
p->
lchild!
=-1)
p=&
ht[p->
lchild];
elseif(data[i]=='
rchild!
rchild];
else
fprintf(fp,"
p->
printf("
if(data[i]!
i--;
//编码,用已及建好的哈夫曼树,对已有的文件进行编码形成报文
voidAlEnCoding(HuffmanCodehc)
FILE*fp1,*fp2;
if((fp1=fopen("
feof(fp1))
data[i]=fgetc(fp1);
num=i;
fclose(fp1);
if((fp2=fopen("
{
fprintf(fp2,"
printf("
break;
}
fclose(fp2);
//译码,用用已及建好的哈夫曼编码,对已有的报文进行解译形成文本
voidAlDeCoding(HuffmanTreeht)
\a\n"
data[i-1]='
putchar('
continue;
fprintf(fp2,"
p=&
if(data[i]!
i--;
voidmain()
HuffmanTreeHT;
Start_Screen();
ReadHuffmanTree();
//读哈夫曼树原始信息
CreateHuffmanTree(&
HT,count);
//创建哈夫曼树
HC=HuffmanCoding(HT,count);
//创建哈夫曼编码
while
(1)
{
switch(t)
case1:
WriteHuffmanTree();
//更新哈夫曼树信息
ReadHuffmanTree();
//读哈夫曼树初始化信息
CreateHuffmanTree(&
HC=HuffmanCoding(HT,count);
case2:
PrintHuffmanTree(HT,count);
//输出哈夫曼树
PrintHuffmanCode(HT,HC,count);
//输出哈夫曼编码
exit(0);
//表示程序正常退出
case3:
EnCoding(HC);
//编码,对所输入的文本进行编码形成报文
case4:
DeCoding(HT);
//译码,对所输入的报文进行解译形成文本
case5:
AlEnCoding(HC);
//编码,对所已有的文本进行编码形成报文
case6:
AlDeCoding(HT);
//译码,对所已有的报文进行解译形成文本
case7:
exit(0);
default:
\a'
system("
cls"
Start_Screen();
Start_Screen();
}
七、实验结果:
运行后各文件内容如下:
DataFile.data文件
A64B13C22D32E103F21G15H47I57J1K5L32M20N57O63P15Q1R48S51T80U23V8W18X1Y16Z1‘‘138
CodeFile.data文件
111010*********00110101011000100001001001001100100010010100111110010101011010011010101111110010001111010111111101010010001101100100010001101111010100
ToBeTran.data文件
THISPROGRAMISMYFAVORITE
Code.txt文件
110100*********1111100010001010011000010010101011001011101100011111110010100011