哈夫曼编码步骤Word下载.docx
- 文档编号:15887667
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:14
- 大小:19.34KB
哈夫曼编码步骤Word下载.docx
《哈夫曼编码步骤Word下载.docx》由会员分享,可在线阅读,更多相关《哈夫曼编码步骤Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
#include<
stdlib.h>
#defineMAXBIT100
#defineMAXVALUE10000
#defineMAXLEAF30
#defineMAXNODEMAXLEAF*2-1
typedefstruct{
intbit[MAXBIT];
intstart;
}HCodeType;
/*编码结构体*/
typedefstruct{
intweight;
intparent;
intlchild;
intrchild;
intvalue;
}HNodeType;
/*结点结构体*/
/*构造一颗哈夫曼树*/
voidHuffmanTree(HNodeTypeHuffNode[MAXNODE],intn){
/*i、j:
循环变量,m1、m2:
构造哈夫曼树不同过程中两个最小权值结点的权值,x1、x2:
构造哈夫曼树不同过程中两个最小权值结点在数组中的序号。
*/
inti,j,m1,m2,x1,x2;
/*初始化存放哈夫曼树数组HuffNode[]中的结点*/
for(i=0;
i<
2*n-1;
i++)
{
HuffNode[i].weight=0;
//权值
HuffNode[i].parent=-1;
HuffNode[i].lchild=-1;
HuffNode[i].rchild=-1;
HuffNode[i].value=i;
//实际值,可根据情况替换为字母
}/*endfor*/
/*输入n个叶子结点的权值*/
n;
{
printf("
Pleaseinputweightofleafnode%d:
\n"
i);
scanf("
%d"
&
HuffNode[i].weight);
/*循环构造Huffman树*/
n-1;
m1=m2=MAXVALUE;
/*m1、m2中存放两个无父结点且结点权值最小的两个结点*/
x1=x2=0;
/*找出所有结点中权值最小、无父结点的两个结点,并合并之为一颗二叉树*/for(j=0;
j<
n+i;
j++)
if(HuffNode[j].weight<
m1&
&
HuffNode[j].parent==-1){
m2=m1;
x2=x1;
m1=HuffNode[j].weight;
x1=j;
}
elseif(HuffNode[j].weight<
m2&
m2=HuffNode[j].weight;
x2=j;
/*设置找到的两个子结点x1、x2的父结点信息*/
HuffNode[x1].parent=n+i;
HuffNode[x2].parent=n+i;
HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight;
HuffNode[n+i].lchild=x1;
HuffNode[n+i].rchild=x2;
x1.weightandx2.weightinround%d:
%d,%d\n"
i+1,HuffNode[x1].weight,HuffNode[x2].weight);
/*用于测试*/
\n"
);
/*
for(i=0;
i<
n+2;
i++)
printf("
Parents:
%d,lchild:
%d,rchild:
%d,value:
%d,weight:
%d\n"
HuffNode[i].parent,HuffNode[i].lchild,HuffNode[i].rchild,HuffNode[i].value,HuffNode[i].weight);
}
*/
//测试
}
/*endHuffmanTree*/
//解码
voiddecodeing(charstring[],HNodeTypeBuf[],intNum){
inti,tmp=0,code[1024];
intm=2*Num-1;
char*nump;
charnum[1024]
strlen(string);
if(string[i]=='
0'
)
num[i]=0;
elsenum[i]=1;
i=0;
nump=&
num[0];
while(nump<
(&
num[strlen(string)]))
{tmp=m-1;
while((Buf[tmp].lchild!
=-1)&
(Buf[tmp].rchild!
=-1))
if(*nump==0)
tmp=Buf[tmp].lchild;
elsetmp=Buf[tmp].rchild;
nump++;
Buf[tmp].value);
intmain(void){
HNodeTypeHuffNode[MAXNODE];
/*定义一个结点结构体数组*/HCodeTypeHuffCode[MAXLEAF],cd;
/*定义一个编码结构体数组,同时定义一个临时变量来存放求解编码时的信息*/inti,j,c,p,n;
charpp[100];
Pleaseinputn:
n);
HuffmanTree(HuffNode,n);
i<
n;
cd.start=n-1;
c=i;
p=HuffNode[c].parent;
while(p!
=-1)
/*父结点存在*/
if(HuffNode[p].lchild==c)
cd.bit[cd.start]=0;
else
cd.bit[cd.start]=1;
cd.start--;
/*求编码的低一位*/
c=p;
p=HuffNode[c].parent;
/*设置下一循环条件*
}/*endwhile*/
/*保存求出的每个叶结点的哈夫曼编码和编码的起始位*/
for(j=cd.start+1;
{
HuffCode[i].bit[j]=cd.bit[j];
HuffCode[i].start=cd.start;
/*输出已保存好的所有存在编码的哈夫曼编码*/
%d'
sHuffmancodeis:
"
for(j=HuffCode[i].start+1;
j<
HuffCode[i].bit[j]);
start:
HuffCode[i].start);
}/*
for(i=0;
i++){
for(j=0;
j<
j++)
}*/
Decoding?
PleaseEntercode:
scanf("
%s"
&
pp);
decodeing(pp,HuffNode,n);
getch();
return0;
}
解码
#include"
string.h"
stdio.h"
#defineMAXVALUE1000/*定义最大权值*/
#defineMAXLEAF30/*定义哈夫曼树叶结点个数*/
#defineMAXNODEMAXLEAF*2-1
#defineMAXBIT30/*定义哈夫曼编码的最大长度*/
typedefstruct
{intbit[MAXBIT];
intstart;
}HCODETYPE;
{intweight;
intparent;
intlchild;
intrchild;
}HNODETYPE;
char*getcode1(char*s1,char*s2,char*s3)/*首先去掉电文中的空格*/
{chartemp[128]="
"
*p,*q;
p=s1;
while((q=strstr(p,s2))!
=NULL)
{*q='
\0'
;
strcat(temp,p);
strcat(temp,s3);
p=q+strlen(s2);
strcpy(s1,temp);
returns1;
/*再去掉重复出现的字符(即压缩电文),提取哈夫曼树叶结点*/
char*getcode(char*s1)
{chars2[26],
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼 编码 步骤
![提示](https://static.bdocx.com/images/bang_tan.gif)