文档介绍:数据结构试验报告
实验三
综合设计
实验题目: 霍夫曼编码课程设计
专业班级: 计科系1507班
组长: 李煜(2015100733)
组员: 高干(2015100730)
张慧锋(2015100725)
王俊艳(2015100715)
2017年 5月 31日
实验报告
实验类型综合设计实验室软件实验室二
实验题目
霍夫曼编码课程设计
实验目的和要求
掌握霍夫曼编码
掌握递归调用的基本运算及应用。
尽可能考虑算法的健壮性。
实验报告中要写出测试数据、错误分析以及收获。
需求分析
霍夫曼编码”(Win32控制台程序)使用Microsoft Visual Basic ,编码采用哈夫曼树路径递归算法,提供查询方式。并尽可能地考虑了系统的健壮性。
提供完整测试数据、原代码文件、Win32控制台程序相关运行截图、系统菜单示意。
提供系统运作流程图、数据传递及函数功能实现原理。
分析程序编写中产生的问题,并列出错误分析过程及解决方法。
概要设计
本次开发的“运动会分数统计系统”实现了上述程序功能,代码如下:
#include <>
#include <>
#include <>
#define MAXLEN 100
typedef struct
{
int weight;
int lchild;
int rchild;
int parent;
char key;
}htnode;
typedef htnode hfmt[MAXLEN];
int n;
void inithfmt(hfmt t)//对结构体进行初始化
{
int i;
printf("\n");
printf("------------------------------------------------------------------\n");
printf("******************************输入区******************************\n");
printf("\n请输入n=");
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;
}
printf("\n");
}
void inputweight(hfmt t)//输入函数
{
int w;//w表示权值
int i;
char k;//k表示获取的字符
for(i=0;i<n;i++)
{
printf("请输入第%d个字符:",i+1);
scanf("%c",&k);
getchar();
t[i].key=k;
printf("请输入第%d个字符的权值:",i+1);
scanf("%d",&w);
getchar();
t[i].weight=w;
printf("\n");
}
}
void selectmin(hfmt t,int i,int *p1,int *p2)//选中两个权值最小的函数
{
long min1=999999;
long min2=999999;
int j;
for(j=0;j<=i;j++)//选择最小权值字符的下标返回
if(t[j].parent==-1)
if(min1>t[j].weight)
{
min1=t[j].weight;
*p1=j;
}
for(j=0;j<=i;j++)//选择次小权值字符的下标还回
if(t[j].parent==-1)
if(min2>t[j].weight && j!=(*p1))//注意 j!=(*p1))
{
min2=t[j].weight;
*p2=j;
}
}
void creathfmt(hfmt t)//创建哈夫曼树的函数
{
int i,p1,p2;
inithfmt(t);
inputweight(t);
for(i=n;i<2*n-1;i++)
{
selectmin(t,i-1,&p1,&p2);
t[p1].parent=i;
t[p2].parent=i