Huffman编码译码器Word下载.docx

上传人:b****6 文档编号:21806989 上传时间:2023-02-01 格式:DOCX 页数:16 大小:297.70KB
下载 相关 举报
Huffman编码译码器Word下载.docx_第1页
第1页 / 共16页
Huffman编码译码器Word下载.docx_第2页
第2页 / 共16页
Huffman编码译码器Word下载.docx_第3页
第3页 / 共16页
Huffman编码译码器Word下载.docx_第4页
第4页 / 共16页
Huffman编码译码器Word下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

Huffman编码译码器Word下载.docx

《Huffman编码译码器Word下载.docx》由会员分享,可在线阅读,更多相关《Huffman编码译码器Word下载.docx(16页珍藏版)》请在冰豆网上搜索。

Huffman编码译码器Word下载.docx

typedefstructabc

{

charch;

charstr[20];

ints;

}ABC;

四、功能设计

(一)、主控菜单设计

为实现编码译码的操作功能,首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。

程序运行后,给出4个菜单项的内容和输入提示,如下:

1、键盘输入进行编码;

2、读文件进行编码;

3、译码;

4、退出系统;

(二)程序模块结构

由课题要求可将程序划分为以下几个模块:

(1)统计字符的频度tongji();

(2)建立哈弗曼树haffman();

(3)编码huffmancode();

(4)输入input();

(5)输出output();

(6)译码yima();

(三)、函数调用关系

其中main()是主函数,它进行菜单驱动,根据选择项0~3调用相应的函数。

main()函数使用switch循环实现重复选择。

其循环结构如下:

 

switch(choice)

case1:

printf("

\t请输入字符串:

\n\t"

);

fflush(stdin);

gets(s);

fp=fopen("

D:

\\yuanwj.txt"

"

w"

fputs(s,fp);

fclose(fp);

case2:

tongji();

haffman();

huffmancode();

您所输入的字母为:

"

input();

您所输入的字母对应的编码为:

output();

getch();

break;

case3:

译码为:

yima();

break;

case0:

return;

}

(四)文件结构

1、mn.h:

主菜单函数的声明

2、mn.cpp:

主菜单函数的实现

3、main.cpp:

主函数

(五)各函数算法设计

1、voidtongji()

charstr1[100];

charch,s;

inti,j,count1=0,count2,k;

//count1为存入字符的个数

FILE*fp;

if((fp=fopen("

rt"

))==NULL)

\n无法打开!

\n"

getchar();

exit

(1);

ch=fgetc(fp);

i=1;

while(ch!

='

#'

str1[i]=ch;

//将输入的字符存入str[i]

count1=i;

i++;

fclose(fp);

//关闭文件

k=0;

for(i=1;

i<

=count1;

i++)

if(str1[i]!

0'

)//字符串以'

\0'

结束

s=str1[i];

count2=0;

for(j=1;

j<

j++)//遍访字符串统计频率count2

if(str1[j]==s)

count2++;

str1[j]='

;

r[k].data=s;

//将每个字符分别赋给r[k].data,这里已经没有重复字符

r[k].weight=count2;

//频率即为权值

r[k].lc=r[k].rc=r[k].parent=0;

//初始化

k++;

n=k;

}

//哈夫曼树的建立

2、voidhaffman()

inti,j,m1,m2,x1,x2;

//m1,m2分别存放最小和次小权值,

//x1,x2分别存放m1和m2的结点地址即该结点在数组r中的下标

i=0;

while(i<

n-1)//n个叶子结点需要n-1次比较

m1=m2=32767;

//初始化

x1=x2=0;

for(j=0;

n+i;

j++)

if((r[j].weight<

m1)&

&

(r[j].parent==0))//寻找森林中的最小权值

m2=m1;

x2=x1;

m1=r[j].weight;

x1=j;

elseif((r[j].weight<

m2)&

(r[j].parent==0))/*寻找森林中的次小权值*/

m2=r[j].weight;

x2=j;

r[x1].parent=n+i;

r[x2].parent=n+i;

r[n+i].weight=r[x1].weight+r[x2].weight;

r[n+i].lc=x1;

r[n+i].rc=x2;

r[n+i].parent=0;

for(i=0;

n;

字母%c的权值为:

%d\n"

r[i].data,r[i].weight);

}

//编码

3、voidhuffmancode()

inti,j,k;

for(i=0;

H[i].ch=r[i].data;

//将字符逐个存入H[i].ch

H[i].str[19]='

//赋结束符

H[i].s=18;

//字符串最大长度

i++)

k=18;

j=i;

//从最后一位开始存储

while(r[j].parent!

=0)//r[i]不是根结点

if(r[r[j].parent].lc==j)

H[i].str[k]='

//左孩子赋'

H[i].s=k;

k--;

j=r[j].parent;

elseif(r[r[j].parent].rc==j)

1'

//右孩子赋'

H[i].s=k;

j=r[j].parent;

字母%c的编码为:

H[i].ch);

for(j=H[i].s;

20;

%c"

H[i].str[j]);

//输入

4、voidinput()

无法打开\n"

//从打开的fp所指向的文件中读取一个字符并送入ch中

=EOF)//遇文件尾时返回EOF

putchar(ch);

//每调用一次向显示器输出一个字符

//关闭文件

//输出

5、voidoutput()

FILE*fp,*fq;

inti;

exit(0);

fq=fopen("

\\out.txt"

wt"

=EOF)

if(H[i].ch==ch)

fputs(&

H[i].str[H[i].s],fq);

}

fclose(fq);

if((fq=fopen("

ch=fgetc(fq);

//从打开的fq所指向的文件中读取一个字符并送入ch中

//从打开的fp所指向的文件中读取一个字符并送入ch中

6、voidyima()

intk;

\\yima.txt"

k=2*n-2;

//2n-2为根结点在数组r中的下标

{

if(ch=='

k=r[k].lc;

else

k=r[k].rc;

if(r[k].lc==NULL&

r[k].rc==NULL)//r[k]为叶子结点

fputc(r[k].data,fq);

//输出字符

五、测试数据与结果

1、测试数据

输入字符串为:

Iwillmeetyouat6.amtomorrowmornimng.

文件保存路径:

\\yuanwj.txt;

D:

\\out.txt;

\\yima.txt.

2、测试结果

(1)、主菜单显示如下:

(2)输入字符串,并进行编码

(3)译码

(4)原文件

Yuanwj.txt

编码文件:

out.txt

译码文件:

yima.txt

六、结束语

哈夫曼编译码器设计,课程设计中,通过该题目的设计过程,我加深了对树的数据结构以及二叉树的逻辑结构,存储结构的理解,对树的数据结构上基本运算的实现有所掌握,对课本中所学的各种数据结构进一步理解和掌握,学会了如何把学到的知识用于解决实际问题,锻炼了自己动手的能力。

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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