数据结构课程设计报告哈夫曼编码.docx

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

数据结构课程设计报告哈夫曼编码.docx

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

数据结构课程设计报告哈夫曼编码.docx

数据结构课程设计报告哈夫曼编码

 

广东工业大学华立学院

课程设计(论文)

 

课程名称_________数据结构___________

题目名称________哈夫曼编码__________

学生学部(系)_信息与计算机学部______

专业班级_______09计算机2班_________

学   号_________________

学生姓名_______________________

指导教师_______________________

 

2010年12月23日

 

 

广东工业大学华立学院

课程设计(论文)任务书

题目名称

哈夫曼编码

学生学部(系)

信息与计算机学部

专业班级

09计算机2班

姓名

学号

一、课程设计(论文)进程安排

序号

设计(论文)各阶段内容

地点

起止日期

1

搜集资料

图书馆

12.10-12.13

2

需求分析

图书馆

12.13-12.14

3

编写算法

宿舍

12.14-12.18

4

调试与测试

宿舍

12.18-12.21

5

撰写课程设计报告

宿舍

12.21-12.23

二、应收集的资料及主要参考文献

[1]严蔚敏,吴伟民.《数据结构:

C语言版》.北京:

清华大学出版社,1997.

[2]耿国华.《数据结构》.北京:

高等教育出版社,2005.

[3]姚伯元.《课程设计(论文)规范化管理与培养学生综合素质》.中国高等教育网教学研究,2005.

[4]严蔚敏,陈文博编著.数据结构及应用算法教程.北京:

清华大学出版社,2001

[5]苏仕华编著.数据结构与算法分析.合肥:

中国科技大学出版社,2004

[6]苏仕华等著.数据结构课程设计.北京:

机械工业出版社,2005

发出任务书日期:

20010年11月20日指导教师签名:

计划完成日期:

20010年12月23日教学单位责任人签章:

摘要

随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。

算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。

算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。

数据结构是在整个计算机科学与技术领域上广泛被使用的术语。

它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。

数据结构有逻辑上的数据结构和物理上的数据结构之分。

逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。

数据结构是数据存在的形式。

数据结构是在整个计算机科学与技术领域上广泛被使用的术语。

它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。

数据结构有逻辑上的数据结构和物理上的数据结构之分。

逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。

数据结构是数据存在的形式。

《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。

数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。

学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。

通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。

 

 

目录

1、设计目的1

2、需求分析1

2.1选题的意义及背景1

2.2输入/输出形式和输出值的范围2

3、概要设计2

3.1设计思想2

3.2函数间的关系2

4、详细设计2

4.1哈夫曼的主要结构2

4.1.1结构定义:

2

4.1.2主要函数声明及功能描述如下3

4.2源程序4

4.2.1头文件head.h4

4.2.2源文件source.cpp5

5、程序测试结果13

6、总结15

7、参考文献15

1、设计目的

数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。

因此,主要有三个方面的内容:

数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。

通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。

数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。

在当今信息时代,信息技术己成为当代知识经济的核心技术。

我们时刻都在和数据打交道。

比如人们在外出工作时找最短路径,在银行查询存款、通过互联网查新闻、以及远程教育报名等,所有这些都在与数据发生关系。

实际上,现实世界中的实体经过抽象以后,就可以成为计算机上所处理的数据。

数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。

数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。

学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。

通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。

通过此次课程设计主要达到以下目的:

1、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;

2、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;

3、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

4、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

2、需求分析

2.1选题的意义及背景

锻炼我们的编码能力,真正理解数据结构的编码思想,并且锻炼我们的动手能力和成员间的配合,提高程序编写能力。

在信息传递时,希望长度能尽可能短,即采用最短码。

赫夫曼编码的应用,就是采用这种有效的数据压缩技术可以节省数据文件的存储空间和计算机网络的传送时间。

2.2输入/输出形式和输出值的范围

输入信息以加载存档的reading.txt文件为方式,加载不成功,提示出错信息,加载成功后,系统对其编码,并按照选择对各种相关信息存档。

3、概要设计

3.1设计思想

哈夫曼树用邻接矩阵作为存储结构,借助静态链表来实现遍历。

3.2函数间的关系

哈夫曼系统,函数间的关系如图所示:

3-1哈夫曼编码问题中函数间的关系

4、详细设计

4.1哈夫曼的主要结构

4.1.1结构定义:

#defineMAXVALUE1000//定义最大权值

#defineMAXBIT100//定义哈夫曼树中叶子结点个数

typedefstruct

{

chardata;//字符值

intnum;//某个值的字符出现的次数

}TotalNode;//统计结点,包括字符种类和出现次数

typedefstruct

{

TotalNodetot[300];//统计结点数组

intnum;//统计数组中含有的字符个数

}Total;//统计结构体,包括统计数组和字符种类数

typedefstruct

{

charmes[300];//字符数组

intnum;//总字符数

}Message;//信息结构体,包括字符数组和总字符数

typedefstruct{

intlocked[500];//密码数组

intnum;//密码总数

}Locking;//哈夫曼编码后的密文信息

typedefstruct

{

chardata;//字符

intweight;//权值

intparent;//双亲结点在数组HuffNode[]中的序号

intlchild;//左孩子结点在数组HuffNode[]中的序号

intrchild;//右孩子结点在数组HuffNode[]中的序号

}HNodetype;//哈夫曼树结点类型,包括左右孩子,权值和信息

typedefstruct

{

intbit[MAXBIT];

intstart;

}HCodetype;//哈夫曼编码结构体,包括编码数组和起始位

4.1.2主要函数声明及功能描述如下:

voidreading_file(Message*message);

从文件中读取信息

voidwriting_file(Message*message);

将信息写进文件

voidtotal_message(Message*message,Total*total);

统计信息中各字符的出现次数

voidHaffmanTree(Total*total,HNodetypeHuffNode[]);

构建哈夫曼树

voidHaffmanCode(HNodetypeHuffNode[],HCodetypeHuffCode[],Total*total);

建立哈夫曼编码

voidwriting_HCode(HNodetypeHuffNode[],HCodetypeHuffCode[],Total*total);

将编码规则写进文件

voidlock(Message*message,HNodetypeHuffNode[],HCodetypeHuffCode[],Total*total,Locking*locking);

给文件信息加密编码

voidwriting_lock(Locking*locking);

将已编码信息写进文件

voidwriting_translate(Locking*locking,HCodetypeHuffCode[],HNodetypeHuffNode[],Total*total);

将已编码信息翻译过来并写进文件

4.2源程序

4.2.1头文件head.h

#defineMAXVALUE1000//定义最大权值

#defineMAXBIT100//定义哈夫曼树中叶子结点个数

typedefstruct

{

chardata;//字符值

intnum;//某个值的字符出现的次数

}TotalNode;//统计结点,包括字符种类和出现次数

typedefstruct

{

TotalNodetot[300];//统计结点数组

intnum;//统计数组中含有的字符个数

}Total;//统计结构体,包括统计数组和字符种类数

typedefstruct

{

charmes[300];//字符数组

intnum;//总字符数

}Message;//信息结构体,包括字符数组和总字符数

typedefstruct{

intlocked[500];//密码数组

intnum;//密码总数

}Locking;//哈夫曼编码后的密文信息

typedefstruct

{

chardata;//字符

intweight;//权值

intparent;//双亲结点在数组HuffNode[]中的序号

intlchild;//左孩子结点在数组HuffNode[]中的序号

intrchild;//右孩子结点在数组HuffNode[]中的序号

}HNodetype;//哈夫曼树结点类型,包括左右孩子,权值和信息

typedefstruct

{

intbit[MAXBIT];

intstart;

}HCodetype;//哈夫曼编码结构体,包括编码数组和起始位

voidreading_file(Message*message);//从文件中读取信息

voidwriting_file(Message*message);//将信息写进文件

voidtotal_message(Message*message,Total*total);//统计信息中各字符的次数

voidHaffmanTree(Total*total,HNodetypeHuffNode[]);//构建哈夫曼树

voidHaffmanCode(HNodetypeHuffNode[],HCodetypeHuffCode[],Total*total);//建立哈夫曼编码

voidwriting_HCode(HNodetypeHuffNode[],HCodetypeHuffCode[],Total*total);//将编码规则写进文件

voidlock(Message*message,HNodetypeHuffNode[],HCodetypeHuffCode[],Total*total,Locking*locking);//给文件信息加密编码

voidwriting_lock(Locking*locking);//将已编码信息写进文件

voidwriting_translate(Locking*locking,HCodetypeHuffCode[],HNodetypeHuffNode[],Total*total);//将已编码信息翻译过来并写进文件

4.2.2源文件source.cpp

#include"head.h"

#include

#include

usingnamespacestd;

intmain()

{

inti,j,choice,mark=0;//mark标记文件信息是否读入到内存中

HNodetypeHuffNode[500];//保存哈夫曼树中各结点信息

HCodetypeHuffCode[300];

Locking*locking;

Total*total;

Message*message;

locking=newLocking;

locking->num=0;

total=newTotal;

total->num=0;

message=newMessage;

message->num=0;//初始化变量

while

(1)

{

cout<<"********************************************************************************";

cout<<"*1:

从文件读取信息2:

显示编码规则3:

将原文件信息写进文件*";

cout<<"*4:

将编码规则写进文件5:

将编码后的信息写进文件6:

将译码后的信息写进文件7:

退出*";

cout<<"********************************************************************************"<

cout<<"请输入操作代码:

";

cin>>choice;

switch(choice)

{

case1:

reading_file(message);//从文件中读取信息

mark=1;

break;

case2:

//显示编码规则

if(mark==0)cout<<"请先从文件中读取信息!

"<

else

{

total_message(message,total);//统计信息中各字符的出现次数

HaffmanTree(total,HuffNode);//构建哈夫曼树

HaffmanCode(HuffNode,HuffCode,total);//建立哈夫曼编码

for(i=0;inum;i++)//显示编码规则

{

cout<tot[i].data<<"";

for(j=HuffCode[i].start+1;jnum;j++)

cout<

cout<

}

}

break;

case3:

//将原文件信息写进文件

if(mark==0)cout<<"请先从文件中读取信息!

"<

else

writing_file(message);//将信息写进文件

break;

case4:

//将编码规则写进文件

if(mark==0)cout<<"请先从文件中读取信息!

"<

else

{

total_message(message,total);//统计信息中各字符的出现次数

HaffmanTree(total,HuffNode);//构建哈夫曼树

HaffmanCode(HuffNode,HuffCode,total);//建立哈夫曼编码

writing_HCode(HuffNode,HuffCode,total);//将编码规则写进文件

}

break;

case5:

//将编码后的信息写进文件

if(mark==0)cout<<"请先从文件中读取信息!

"<

else

{

total_message(message,total);//统计信息中各字符的出现次数

HaffmanTree(total,HuffNode);//构建哈夫曼树

HaffmanCode(HuffNode,HuffCode,total);//建立哈夫曼编码

lock(message,HuffNode,HuffCode,total,locking);//给文件信息加密编码

writing_lock(locking);//将已编码信息写进文件

}

break;

case6:

//将译码后的信息写进文件

if(mark==0)cout<<"请先从文件中读取信息!

"<

else

{

total_message(message,total);//统计信息中各字符的出现次数

HaffmanTree(total,HuffNode);//构建哈夫曼树

HaffmanCode(HuffNode,HuffCode,total);//建立哈夫曼编码

writing_translate(locking,HuffCode,HuffNode,total);//将已编码信息翻译过来并写进文件

}

break;

case7:

exit

(1);

default:

cout<<"输入错误,请重新选择"<

}

}

for(i=0;inum;i++)

if(locking->locked[i]==-1)cout<<"";

else

cout<locked[i];

cout<

for(i=0;inum;i++)

cout<tot[i].data<<""<tot[i].num<

for(i=0;i<2*(total->num)-1;i++)

cout<

cout<

return0;

}

voidreading_file(Message*message)

{

/*打开reading文件,失败则结束。

不断读取字符并保存进message数组中,

直到遇到#结束,记录字符总数*/

inti=0;

charch;

ifstreaminfile("c:

\\reading.txt",ios:

:

in|ios:

:

out);

if(!

infile)//打开失败则结束

{

cout<<"打开c:

\\reading.txt文件失败"<

exit

(1);

}

else

cout<<"读取文件成功"<

while(infile.get(ch)&&ch!

='#')//读取字符直到遇到#

{

message->mes[i]=ch;

i++;

}

message->num=i;//记录总字符数

infile.close();//关闭文件

}//从文件中读取信息

voidwriting_file(Message*message)//将信息写进文件

{/*打开writing文件,失败则结束。

将信息写进文件*/

inti;

ofstreamoutfile("c:

\\writing.txt",ios:

:

in|ios:

:

out);//打开文件

if(!

outfile)//打开失败则结束

{cout<<"打开c:

\\writing.txt文件失败"<

exit

(1);

}

for(i=0;inum;i++)//写文件

outfile.put(message->mes[i]);

cout<<"信息写进文件成功"<

outfile.close();//关闭文件

}//将原信息写入文件

voidtotal_message(Message*message,Total*total)

{

/*将message中的字符种类及出现次数统计保存到total数组中,重复字符用mark标记,

否则新建字符种类。

记录下字符种类的个数*/

inti,j,mark;

for(i=0;inum;i++)//遍历message中的所有字符信息

{

if(message->mes[i]!

='')//字符不为空格时

{

mark=0;

for(j=0;jnum;j++)//在total中搜索当前字符

if(total->tot[j].data==message->mes[i])//搜索到,则此字符次数加1,mark标志为1

{

total->tot[j].num++;

mark=1;

break;

}

if(mark==0)//未搜索到,新建字符种类,保存进total中,字符类加1

{total->tot[total->num].data=message->mes[i];

total->tot[total->num].num=1;

total->num++;

}

}

}

}//统计信息中各字符的出现次数

voidHaffmanTree(Total*total,HNodetypeHuffNode[])

{

/*通过每次选取最小和次小两权值建立二叉树,最终构建成哈夫曼树,

且左孩子权值比右孩子小*/

inti,j,min1,min2,x1,x2;

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

当前位置:首页 > 医药卫生 > 基础医学

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

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