哈夫曼编译码器代码课程设计Word格式文档下载.docx
《哈夫曼编译码器代码课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《哈夫曼编译码器代码课程设计Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
(2)此哈夫曼编/译码器应具有编和译的双向功能,即在发送端通过编码系统对传入的数据进行编码,
在接受端将数据译码.将具有这两项功能的编译码器用于双工信道,就可满足双工信道的双向编译功能.
(3)输入某段报文时,系统将自动完成编译输出.
要求:
1:
I:
初始化。
从中端读入字符集大小n,以及n个字符和n各权值,建树,并存于hfmTree中
2:
E:
编码。
利用已建好的树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,
然后将结果存入文件CodeFile.
3:
D:
译码。
利用已建好的树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。
4:
P:
印代码文件CodeFile。
将文件以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrin中。
5T:
印哈夫曼树。
将已在内存中的树以直观的方式(树或凹入表形式)显示在终端,同时将此字符形式
的哈夫曼树写入文件TreePrin中。
以上是题目要求
#definemax50
structa
{
intweight;
intparent,lchild,rchild;
};
structb
charcd[max];
intstart;
main()
structaht[2*max];
structbhcd[max],d;
inti,j,k,n,c,s1,s2,m1,m2,f;
printf("
shurun:
"
);
scanf("
%d"
&
n);
for(i=1;
i<
=n;
i++)
shuruquanzhi:
ht[i].weight);
ht[i].parent=0;
}
for(;
=2*n-1;
ht[i].parent=ht[i].lchild=ht[i].rchild=0;
for(i=n+1;
m1=m2=30000;
s1=s2=0;
for(k=1;
k<
=i-1;
k++)
if(ht[k].parent==0&
&
ht[k].weight<
m1)
m2=m1;
s2=s1;
m1=ht[k].weight;
s1=k;
elseif(ht[k].parent==0&
m2)
m2=ht[k].weight;
s2=k;
ht[s1].parent=ht[s2].parent=i;
ht[i].lchild=s1;
ht[i].rchild=s2;
ht[i].weight=ht[s1].weight+ht[s2].weight;
d.start=n-1;
c=i;
f=ht[i].parent;
while(f)
if(ht[f].lchild==c)d.cd[--d.start]='
0'
;
elsed.cd[--d.start]='
1'
c=f;
f=ht[f].parent;
hcd[i]=d;
shuchuhafubianma"
%d"
ht[i].weight);
for(k=hcd[i].start;
n-1;
%c"
hcd[i].cd[k]);
"
程序设计方案2
哈夫曼编/译码器(课程设计)
#include<
iomanip.h>
string.h>
malloc.h>
stdio.h>
//typedefintTElemType;
constintUINT_MAX=1000;
typedefstruct
{
}HTNode,*HuffmanTree;
typedefchar**HuffmanCode;
//-----------全局变量-----------------------
HuffmanTreeHT;
HuffmanCodeHC;
int*w,i,j,n;
char*z;
intflag=0;
intnumb=0;
//-----------------求赫夫曼编码-----------------------
intmin(HuffmanTreet,inti)
{//函数voidselect()调用
intj,flag;
intk=UINT_MAX;
//取k为不小于可能的值
for(j=1;
j<
=i;
j++)
if(t[j].weight<
k&
t[j].parent==0)
k=t[j].weight,flag=j;
t[flag].parent=1;
returnflag;
}
//--------------------slect函数----------------------
voidselect(HuffmanTreet,inti,int&
s1,int&
s2)
{//s1为最小的两个值中序号小的那个
intj;
s1=min(t,i);
s2=min(t,i);
if(s1>
j=s1;
s1=s2;
s2=j;
//--------------算法6.12--------------------------
voidHuffmanCoding(HuffmanTree&
HT,HuffmanCode&
HC,int*w,intn)
{//w存放n个字符的权值(均>
0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC
intm,i,s1,s2,start;
//unsignedc,f;
intc,f;
HuffmanTreep;
char*cd;
if(n<
=1)
return;
//检测结点数是否可以构成树
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
//0号单元未用
for(p=HT+1,i=1;
++i,++p,++w)
p->
weight=*w;
parent=0;
lchild=0;
rchild=0;
=m;
++i,++p)
++i)//建赫夫曼树
{//在HT[1~i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2
select(HT,i-1,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;
//从叶子到根逆向求每个字符的赫夫曼编码
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
//分配n个字符编码的头指针向量([0]不用)
cd=(char*)malloc(n*sizeof(char));
//分配求编码的工作空间
cd[n-1]='
\0'
//编码结束符
i++)
{//逐个字符求赫夫曼编码
start=n-1;
//编码结束符位置
for(c=i,f=HT[i].parent;
f!
=0;
c=f,f=HT[f].parent)
//从叶子到根逆向求编码
if(HT[f].lchild==c)
cd[--start]='
else
HC[i]=(char*)malloc((n-start)*sizeof(char));
//为第i个字符编码分配空间
strcpy(HC[i],&
cd[start]);
//从cd复制编码(串)到HC
free(cd);
//释放工作空间
//--------------初始化赫夫曼链表---------------------------------
voidInitialization()
flag=1;
intnum;
intnum2;
cout<
<
下面初始化赫夫曼链表"
endl<
请输入结点的个数n:
cin>
>
num;
n=num;
w=(int*)malloc(n*sizeof(int));
z=(char*)malloc(n*sizeof(char));
\n请依次输入"
n<
个字符(字符型)\n注意:
必须以回车结束:
endl;
charbase[2];
for(i=0;
n;
第"
i+1<
个字符:
gets(base);
*(z+i)=*base;
=n-1;
setw(6)<
*(z+i);
个权值(\n注意:
必须以回车结束):
个字符的权值:
c