哈夫曼编译码器代码课程设计Word格式文档下载.docx

上传人:b****3 文档编号:15864775 上传时间:2022-11-16 格式:DOCX 页数:22 大小:20.78KB
下载 相关 举报
哈夫曼编译码器代码课程设计Word格式文档下载.docx_第1页
第1页 / 共22页
哈夫曼编译码器代码课程设计Word格式文档下载.docx_第2页
第2页 / 共22页
哈夫曼编译码器代码课程设计Word格式文档下载.docx_第3页
第3页 / 共22页
哈夫曼编译码器代码课程设计Word格式文档下载.docx_第4页
第4页 / 共22页
哈夫曼编译码器代码课程设计Word格式文档下载.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

哈夫曼编译码器代码课程设计Word格式文档下载.docx

《哈夫曼编译码器代码课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《哈夫曼编译码器代码课程设计Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。

哈夫曼编译码器代码课程设计Word格式文档下载.docx

(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1