数据结构课程设计哈夫曼树.docx

上传人:b****1 文档编号:596169 上传时间:2022-10-11 格式:DOCX 页数:21 大小:144.49KB
下载 相关 举报
数据结构课程设计哈夫曼树.docx_第1页
第1页 / 共21页
数据结构课程设计哈夫曼树.docx_第2页
第2页 / 共21页
数据结构课程设计哈夫曼树.docx_第3页
第3页 / 共21页
数据结构课程设计哈夫曼树.docx_第4页
第4页 / 共21页
数据结构课程设计哈夫曼树.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

数据结构课程设计哈夫曼树.docx

《数据结构课程设计哈夫曼树.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计哈夫曼树.docx(21页珍藏版)》请在冰豆网上搜索。

数据结构课程设计哈夫曼树.docx

数据结构课程设计哈夫曼树

课程设计

 

课程设计名称:

数据结构课程设计

专业班级:

学生姓名:

学号:

指导教师:

课程设计时间:

2015.7.06—2015.7.10

 

计算机类专业课程设计任务书

学生

专业班级

学号

题目

哈夫曼树编/译码系统

课题性质

A

课题来源

D

指导教师

同组

主要容

1.学习掌握并熟练运用C语言进行程序设计,

2.针对具体应用问题,选择、设计和实现合适的抽象数据类型;

3.进行整体设计使各个函数之间紧密联系起来;

任务要求

1.综合运用和融化所学理论知识,提高分析和解决实际问题的能力,达到培养良好程序设计能力和习惯的目的,为开发满足问题要求的小型应用软件奠定基础,达到软件工程的综合性基础训练的目的。

2.完成需求分析报告,报告中对关键部分给出图表说明。

要求格式规,工作量饱满。

参考文献

《C语言程序设计》(第三版)谭浩强清华大学

《CPrimerPlus》(第5版)Stephen prata人民邮电

审查意见

指导教师签字:

教研室主任签字:

年月日

 

1需求分析

1.1系统介绍

利用Huffman编码进行通信可以大大提高信道利用率.缩短信息传输时间,降低传输成本,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。

对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

此程序就是为这样的信息收发站写一个Huffman码的编/译码系统。

1.2程序的输入和输出

从终端读入字符集大小n,以及n个字符及各个字符的权值,建立赫夫曼树,并将它存储到文件hfmTree中;利用已建好的赫夫曼树将文件中的字符编码,如果赫夫曼树不在存中,则从文件hfmTree中读取到存;将译得的代码存到文件CodeFile中;利用已建好的赫夫曼树对CodeFile中的代码进行译码,将结果存入文件TextFile中;最后将已在存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

1.3程序要达到的功能

用户可以利用菜单根据自己的需要来选择要进行编码或是译码,并将转换好的字符或编码以文件的形式存到相应的文件里面。

1.4调试过程介绍

(l)利用教材中的数据调试程序。

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

"THISPROGRAMISMYFAVORITE"。

字符

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

频度

186

64

13

22

32

103

21

15

47

57

1

5

32

20

57

63

15

1

48

51

80

23

8

18

1

16

1

选择2,输入THISPROGRAMISMYFAVORITE,屏幕上显示01010

同时文件codefile里面也出现相应的代码

选择3,从codefile中调入代码,终端显示THISPROGRAMISMYFAVORITE,并且文件textfile中也相应的存入了这段话。

选择4,文件CodeFile以紧凑格式显示在终端上。

选择5,将已在存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

选择其他的数字,将出现出错提示,并重新回到选择菜单。

2概要设计

2.1数据结构设计

InitHuffman(HuffmanHfm);//初始化哈夫曼树

Encoding(HuffmanHfm);//翻译短文

Decoding(HuffmanHfm);//反译编码

Print1(HuffmanHfm);//打印文件编码

Print2(HuffmanHfm);//打印哈夫曼树

typedefchar**HuffmanCode;//动态分配数组存储霍夫曼表码表

typedefstruct{

unsignedintweight;

unsignedintparent,lchild,rchild;

}HTNode,*HuffmanTree;//动态分配数组存储霍夫曼树

typedefstruct{

HuffmanTreeHT;

char*c;

intlength;

HuffmanCodeHC;

}Huffman;//分配数组存储字符串及其对应的霍夫曼树

HuffmanHfm;

2.2系统模块设计

3详细设计

#include

#include

#include

#include

#defineNULL0

#defineOK1

#defineERROR0

#defineOVERFLOW-2

#defineMAX_NUM32767

#defineMAX60

typedefchar**HuffmanCode;//动态分配数组存储哈夫曼表码表

typedefstruct{

unsignedintweight;

unsignedintparent,lchild,rchild;

}HTNode,*HuffmanTree;//动态分配数组存储哈夫曼树

typedefstruct{

HuffmanTreeHT;

char*c;

intlength;

HuffmanCodeHC;

}Huffman;//全局结构体变量,来存储字符与代码

/*------------------------------------------寻找权值最小的两个节点-------------------------------------*/

voidSelect(HuffmanTreeHT,intend,int*s1,int*s2)

{

inti;

intmin1=MAX_NUM;

intmin2;

for(i=1;i<=end;i++)/*遍历查找权值最小的结点S1*/

{

if(HT[i].parent==0&&HT[i].weight

{

*s1=i;

min1=HT[i].weight;

}

}

min2=MAX_NUM;

for(i=1;i<=end;i++)/*遍历查找除S1外权值最小的结点S2*/

{

if(HT[i].parent==0&&(*s1!

=i)&&min2>HT[i].weight)

{

*s2=i;

min2=HT[i].weight;

}

}

}

/*------------------------------------对哈夫曼树进行编码-------------------------------------*/

HuffmanHuffmanCoding(HuffmanHfm)

{

inti,n,m,s1,s2,start;

intc,f;

char*cd;

n=Hfm.length;

if(n<=1)returnHfm;

m=2*n-1;

for(i=n+1;i<=m;++i)/*选择HT[1....i-1]中无双亲且权值最小的两个节点,其序号为s1,s2*/

{

Select(Hfm.HT,i-1,&s1,&s2);

Hfm.HT[s1].parent=i;/*修改父亲位置*/

Hfm.HT[s2].parent=i;

Hfm.HT[i].lchild=s1;/*修改孩子位置*/

Hfm.HT[i].rchild=s2;

Hfm.HT[i].weight=Hfm.HT[s1].weight+Hfm.HT[s2].weight;/*父亲结点权值为左右孩子权值之和*/

}

/*从叶子结点到根逆向求每个字符的哈夫曼编码*/

Hfm.HC=(HuffmanCode)malloc((n+1)*sizeof(char*));/*分配n个字符编码的头指针向量*/

cd=(char*)malloc(n*sizeof(char));/*分配求编码的工作空间*/

cd[n-1]='\0';/*编码结束符*/

for(i=1;i<=n;++i)/*逐个字符求哈夫曼编码*/

{

start=n-1;/*编码结束符位置*/

for(c=i,f=Hfm.HT[i].parent;f!

=0;c=f,f=Hfm.HT[f].parent)/*从叶子到根逆向求编码*/

{

if(c==Hfm.HT[f].lchild)cd[--start]='0';

elsecd[--start]='1';

}

Hfm.HC[i]=(char*)malloc((n-start)*sizeof(char));

strcpy(Hfm.HC[i],&cd[start]);/*从cd复制编码到Hfm.HC*/

}

free(cd);

returnHfm;

}

/*------------------------------------录入数据函数-------------------------------------*/

HuffmanInputHuffman(HuffmanHfm)

{

inti,n;

printf("\n\n********************录入数据*********************\n");

printf("录入的字符及其权值将保存于:

\hfmTree\\n");

printf("请输入录入字符个数:

");

scanf("%d",&n);

if(n<=1)

{printf("只有一个字符无需编码");

printf("\n");

printf("请输入录入字符个数:

");

scanf("%d",&n);}

Hfm.HT=(HuffmanTree)malloc((2*n)*sizeof(HTNode));

Hfm.c=(char*)malloc((n+1)*sizeof(char));

for(i=1;i<=n;i++)

{

printf("请输入字符:

");

scanf("%s",&Hfm.c[i]);

printf("请输入字符权值:

");

scanf("%d",&Hfm.HT[i].weight);

Hfm.HT[i].parent=0;

Hfm.HT[i].lchild=0;

Hfm.HT[i].rchild=0;

}

for(;i<=2*n-1;++i)

{

Hfm.HT[i].weight=0;

Hfm.HT[i].parent=0;

Hfm.HT[i].lchild=0;

Hfm.HT[i].rchild=0;

}

Hfm.length=n;

returnHfm;

}

/*------------------------------------初始化哈夫曼树-----

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

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

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

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