西安工业大学数据结构课程设计实验报告赫夫曼编码Word文件下载.docx
《西安工业大学数据结构课程设计实验报告赫夫曼编码Word文件下载.docx》由会员分享,可在线阅读,更多相关《西安工业大学数据结构课程设计实验报告赫夫曼编码Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。
![西安工业大学数据结构课程设计实验报告赫夫曼编码Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/31/ef0e07bf-cccc-4e4c-ae59-7846239171c7/ef0e07bf-cccc-4e4c-ae59-7846239171c71.gif)
3.系统结构图(功能模块图)5
四、赫夫曼编码源代码5
五、调试分析10
1.输入10
2.建立赫夫曼树10
3.编码10
六、实验心得与体会11
一、实验目的
数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。
因此,主要有三个方面的内容:
数据的逻辑结构;
数据的物理存储结构;
对数据的操作(或算法)。
通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。
数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
在当今信息时代,信息技术己成为当代知识经济的核心技术。
我们时刻都在和数据打交道。
比如人们在外出工作时找最短路径,在银行查询存款、通过互联网查新闻、以及远程教育报名等,所有这些都在与数据发生关系。
实际上,现实世界中的实体经过抽象以后,就可以成为计算机上所处理的数据。
数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:
1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
二、题目——赫夫曼编码
1.问题描述
利用赫夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
这要求在发送端通过一个编码系统对待传输数据预先编码,因此需要一个完整的赫夫曼编码系统。
试为发送端编写一个赫夫曼码的编码系统。
2.基本要求
一个完整的系统应具有以下功能:
(1)初始化(Initialization):
从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,输出结果。
(2)编码(Encoding):
利用已建好的赫夫曼树,对赫夫曼树进行编码,输出结果。
3.测试要求
已知某系统在通信联络中只可能出现八种字符,其频率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计赫夫曼编码。
三、概要设计
1.分析赫夫曼树的定义
(1)赫夫曼树节点的数据类型定义为:
typedefstruct
{
intweight;
//节点权值
intparent,lchild,rchild;
//左右孩子的节点
}htnode,*huffmantree;
typedefchar**huffmancode;
2.所实现的功能函数
(1)voidhuffmancoding(huffmantreeht,huffmancodehc,int*w,intn)
//初始化赫夫曼树,处理函数得到的数据按照赫夫曼规则建立2叉树。
此函数块调用了Select()函数。
(2)voidselect(huffmantreeht,intn,int*s1,int*s2)
//Select()函数,选出赫夫曼树到n为止,权值最小且parent为0的2个节点。
(3)intmain()主函数
//让用户利用已建好的赫夫曼树对输入的数据进行编码,输出结果。
使用数组存储,然后分别调用排序函数,建立赫夫曼函数,编码函数等来实现功能。
3.系统结构图(功能模块图)
四、赫夫曼编码源代码
#include<
stdlib.h>
stdio.h>
string.h>
//节点权值
//双亲、左右孩子的节点
voidselect(huffmantreeht,intn,int*s1,int*s2)//挑选权值较小的两个节点
inti,j,temp;
for(i=1;
i<
=n;
i++)
if(ht[i].parent==0)
{
*s1=i;
break;
}
for(j=i+1;
j<
j++)
if(ht[j].parent==0)
{
*s2=j;
break;
}
for(i=1;
i++)//挑选权值较小左节点
if(ht[i].parent==0)
if(ht[*s1].weight>
ht[i].weight)
if(*s2!
=i)
*s1=i;
for(j=1;
j++)//挑选权值较小右节点
if(ht[j].parent==0)
if(ht[*s2].weight>
ht[j].weight)
if(*s1!
=j)
*s2=j;
if(*s1>
*s2)
temp=*s1;
*s1=*s2;
*s2=temp;
}
voidhuffmancoding(huffmantreeht,huffmancodehc,int*w,intn)
{//求赫夫曼树的算法
inti,m;
intstart,c,f;
ints1,s2;
char*cd;
if(n<
=1)//n小于2无需构造赫夫曼树
return;
m=2*n-1;
//一共有m=2n-1个节点
ht=(huffmantree)malloc((m+1)*sizeof(htnode));
//0号单元没用;
i++)//数组初始化
{
ht[i].weight=w[i-1];
ht[i].parent=0;
ht[i].lchild=0;
ht[i].rchild=0;
}
for(;
=m;
++i)
ht[i].weight=0;
ht[i].parent=0;
printf("
************构造过程***************\n"
);
for(i=n+1;
select(ht,i-1,&
s1,&
s2);
//自己的编写代码
ht[s1].parent=i;
ht[s2].parent=i;
ht[i].lchild=s1;
ht[i].rchild=s2;
ht[i].weight=ht[s1].weight+ht[s2].weight;
printf("
┌──┬──┬──┬──┬───┐\n"
%d%d%d%d%d\n"
i,ht[i].weight,ht[i].parent,ht[i].lchild,ht[i].rchild);
└──┴──┴──┴──┴───┘\n"
//从叶子到根节点的逆向求每个字符的赫夫曼编码
//分配n个字符编码的头指针向量;
cd=(char*)malloc(n*sizeof(char));
//分配球编码的工作空间
cd[n-1]='
\0'
;
//编码结束符
{//逐个字符求赫夫曼编码
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]='
0'
elsecd[--start]='
1'
hc[i]=(char*)malloc((n-start)*sizeof(char));
//为第i个字符编码分配空间
strcpy(hc[i],&
cd[start]);
//从cd复制编码(字符串)到hc
}
}//huffancoding
intmain()
inti,n;
int*w;
huffmantreeht;
huffmancodehc;
请输入构建赫夫曼树的节点数与权值"
scanf("
%d\n"
&
n);
hc=(huffmancode)malloc(n*sizeof(huffmancode));
w=(int*)malloc(n*sizeof(int));
for(i=0;
n;
scanf("
w[i]);
huffmancoding(ht,hc,w,n);
输出编码为:
\n"
┌──────┬───────┐\n"
权重为:
%d编码为:
%s\n"
w[i-1],hc[i]);
└──────┴───────┘\n"
fflush(stdin);
getchar();
return0;
五、调试分析
1.输入:
2.建立赫夫曼树:
3.编码:
六、实验心得与体会
在这次课程设计中,自己在编写好源代码后的调试中出现了不少的错误,遇到了很多麻烦及困难,在我调试修改程序中的错误时,通过分析,我学到了:
1.在定义头文件时可多不可少,即我们可多写些头文件,肯定不会出错,但是若没有定义所引用的相关头文件,必定调试不通过;
2.编写和调试程序时应该有足够的耐心和细心等。
通过本次数据结构的课程设计,我学习了很多在上课没懂的知识,并对求赫夫曼树及赫夫曼编码的算法有了更加深刻的了解,更巩固了课堂中学习有关于赫夫曼编码的知识,真正学会一种算法了。
当求解一个算法时,不是拿到问题就不加思索地做,而是首先要先对它有个大概的了解,接着再详细地分析每一步怎么做,无论自己以前是否有处理过相似的问题,只要按照以上的步骤,必定会顺利地做出来。
这次课程设计,我在编辑中犯了一些不应有的错误,在不断分析后明确并改正了错误和疏漏,使程序有了更高的质量,也使我懂得了一个成功的项目必须在写代码前,先对课题有充分的思考和规划,否则即使完成了项目也会浪费很多的时间和精力,科学合理的编程方法也是我这次课程设计的最大收获。