哈夫曼码编译码器的实现供参考Word文档格式.docx

上传人:b****4 文档编号:17587014 上传时间:2022-12-07 格式:DOCX 页数:13 大小:19.10KB
下载 相关 举报
哈夫曼码编译码器的实现供参考Word文档格式.docx_第1页
第1页 / 共13页
哈夫曼码编译码器的实现供参考Word文档格式.docx_第2页
第2页 / 共13页
哈夫曼码编译码器的实现供参考Word文档格式.docx_第3页
第3页 / 共13页
哈夫曼码编译码器的实现供参考Word文档格式.docx_第4页
第4页 / 共13页
哈夫曼码编译码器的实现供参考Word文档格式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

哈夫曼码编译码器的实现供参考Word文档格式.docx

《哈夫曼码编译码器的实现供参考Word文档格式.docx》由会员分享,可在线阅读,更多相关《哈夫曼码编译码器的实现供参考Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。

哈夫曼码编译码器的实现供参考Word文档格式.docx

typedefchar**HfCode;

//动态分配字符数组存储哈夫曼编码表

(7)基本操作的函数设计

voidInitHFMT(HFMTT);

//初始化哈夫曼树

voidInputWeight(HFMTT,char*weightFile);

//输入权值

voidSelectMin(HFMTT,inti,int*p1,int*p2);

//选择所有结点中较小的结点

voidCreatHFMT(HFMTT);

//构造哈夫曼树,T[2*n-1]为其根结点

voidPrintHFMT(HFMTT);

//输出向量状态表

voidprintHfCode(HfCodehc);

//输出字符的哈夫曼编码序列

HfCodehfEnCoding(HFMTT);

//利用构成的哈夫曼树生成字符的编码

voidprint_HuffmanTree(HFMTHT,intt,inti)//按树形形态输出哈夫曼树的形态

voidEncoder(char*original,char*codeFile,HfCodehc,HFMTHT);

//利用已建好的哈夫曼树,对original文件中要传输的原始数据进行编码,

//将编码结果存入文件codeFile中

voidDecoder(char*codeFile,char*textFile,HFMTHT);

//利用已建好的哈夫曼树,对传输到达的codeFile中的数据代码进行译码,

//将译码结果存入文件textFile中

2、实验要求

(1)、用C语言编程实现上述实验内容中的结构定义和算法。

(2)、要有main()函数,并且在main()函数中使用检测数据调用上述算法。

(3)、实验完成后撰写实验报告,实验报告的具体格式参见《实验报告须知》。

(4)、实验完成后把打印好的实验报告以及电子版的实验报告和源程序一并上交。

四、参考源代码:

#include<

string.h>

stdlib.h>

stdio.h>

iostream.h>

#defineMAXLEN100

typedefstruct//定义哈夫曼树中每个结点结构体类型

//定义一个整型权值变量

//定义左、右孩子及双亲指针

//动态分配字符数组存储哈夫曼编码表

intn;

voidInitHFMT(HFMTT)

//初始化哈夫曼树

inti;

printf("

\n\t\t请输入共有多少个权值(小于100):

"

);

scanf("

%d"

&

n);

getchar();

for(i=0;

i<

2*n-1;

i++)

{

T[i].weight=0;

T[i].lchild=-1;

T[i].rchild=-1;

T[i].parent=-1;

}

}

voidInputWeight(HFMTT,char*weightFile)

intw;

intn;

FILE*fp;

if((fp=fopen(weightFile,"

r"

))!

=NULL)

fscanf(fp,"

%d\n"

for(i=0;

i<

n;

i++)

{

ch=fgetc(fp);

fscanf(fp,"

w);

T[i].ch=ch;

T[i].weight=w;

}

}

fclose(fp);

voidSelectMin(HFMTT,inti,int*p1,int*p2)

//选择所有结点中两个结点较小的结点

longmin1=999999;

//预设两个值,并使它大于可能出现的最大权值

longmin2=999999;

intj;

for(j=0;

j<

=i;

j++)

if(T[j].parent==-1)

if(min1>

T[j].weight)

{

min1=T[j].weight;

//找出最小的权值

*p1=j;

//通过*p1带回序号

}

j++)

{

{

if(min2>

T[j].weight&

&

j!

=(*p1))

min2=T[j].weight;

//找出次最小的权值

*p2=j;

}//通过*p2带回序号

}

voidCreatHFMT(HFMTT)

inti,p1,p2;

InitHFMT(T);

InputWeight(T,"

weight.txt"

for(i=n;

SelectMin(T,i-1,&

p1,&

p2);

T[p1].parent=T[p2].parent=i;

//T[i].lchild=T[p1].weight;

//T[i].rchild=T[p2].weight;

T[i].lchild=p1;

T[i].rchild=p2;

T[i].weight=T[p1].weight+T[p2].weight;

voidPrintHFMT(HFMTT)//输出向量状态表

{

inti,k=0;

while(T[i].lchild!

=-1)

if(!

(k%2))

printf("

\n"

\t\t(%d%d),(%d%d)"

T[i].weight,T[i].lchild,T[i].weight,T[i].rchild);

k++;

break;

voidprintHfCode(HfCodehc)

for(inti=0;

printf("

%s"

hc[i]);

HfCodehfEnCoding(HFMTT)

intstart;

HfCodehc=newchar*[(n+1)*sizeof(char*)];

//分配n个字符编码

char*cd=newchar[n*sizeof(char)];

//分配求编码的工作空间

cd[n-1]='

\0'

;

//编码结束符

intc;

intf;

start=n-1;

for(c=i,f=T[i].parent;

f!

=-1;

c=f,f=T[f].parent)//从叶子结点到根逆向求编码

if(T[f].lchild==c)

cd[--start]='

0'

else

1'

hc[i]=newchar[(n-start)*sizeof(char)];

//为第i个编码分配空间

strcpy(hc[i],&

cd[start]);

\n%c:

T[i].ch,hc[i]);

returnhc;

voidprint_HuffmanTree(HFMTHT,intt,inti)

//按树形形态输出哈夫曼树的形态

if(HT[t].rchild!

=-1)//先打印出右子树

print_HuffmanTree(HT,HT[t].rchild,i+1);

for(intj=1;

=3*i;

j++)//打印空格表示结点所在的层次

"

//再输出根结点

if(HT[t].lchild!

=-1||HT[t].rchild!

=-1)

HT[t].weight);

else

%c(%d)\n"

HT[t].ch,HT[t].weight);

//最后输出左子树

=-1)

print_HuffmanTree(HT,HT[t].lchild,i+1);

voidEncoder(char*original,char*codeFile,HfCodehc,HFMTHT)

//利用已建好的哈夫曼树,对original文件中要传输的原始数据进行编码,

//将编码结果存入文件codeFile中.

char*str;

//用于存储需编码内容

inti=0;

charch;

intk=0;

FILE*fin;

FILE*fout;

if((fin=fopen(original,"

fscanf(fin,"

%c"

ch);

while(!

feof(fin))

//计算CodeFile中代码长度

fscanf(fin,"

}

fclose(fin);

str=newchar[k+1];

k=0;

str[k++]=ch;

str[k]='

//结束标志符

printf("

要编码的数据是:

%s\n"

str);

if((fout=fopen(codeFile,"

w"

while(str[k]!

='

)//将字符编码

for(i=0;

if(str[k]==HT[i].ch)

{

fprintf(fout,"

break;

}

已编码!

且存到文件CodeFile.dat中!

\n\n"

fclose(fout);

voidDecoder(char*codeFile,char*textFile,HFMTHT)

//将译码结果存入文件textFile中.

inti=0,k=0;

intj=n*2-1-1;

//表示从根结点开始往下搜索

char*bitStr;

//读取codeFile文本文件指针

经译码的内容为:

if((fin=fopen(codeFile,"

//计算CodeFile中代码长度

bitStr=newchar[k+1];

bitStr[k++]=ch;

bitStr[k]='

//结束标志符

if(HT==NULL)//还未建哈夫曼树

请先编码!

return;

if((fout=fopen(textFile,"

=NULL)//将字符形式的编码文件写入文件CodePrin中

while(bitStr[i]!

if(bitStr[i]=='

j=HT[j].lchild;

//往左走

else

j=HT[j].rchild;

//往右走

if(HT[j].rchild==-1)//到达叶子结点

{

ch=HT[j].ch;

fprintf(fout,"

ch);

j=n*2-1-1;

//表示重新从根结点开始往下搜索

i++;

}//while

fclose(fout);

\n译码成功且已存到文件textFile.txt\n\n"

voidmain()//主函数

HFMTHT;

CreatHFMT(HT);

PrintHFMT(HT);

HfCodehc=hfEnCoding(HT);

\n哈夫曼树形态为:

print_HuffmanTree(HT,2*n-2,0);

Encoder("

original.txt"

"

codefile.txt"

hc,HT);

Decoder("

codeFile.txt"

"

textfile.txt"

HT);

五、运行测试

测试数据:

(1)利用数据调试程序。

(2)用下表给出的字符集和频度计数建立哈曼树,并实现以下报文的编码和译码:

“THISPROGRAMISMYFAVORITE”。

字符

A

B

C

D

E

F

G

H

I

J

K

L

M

频数

64

13

22

32

103

21

15

47

57

1

5

20

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

63

48

51

80

23

8

18

16

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

当前位置:首页 > 初中教育 > 语文

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

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