- 3
- 0
- 约4.06千字
- 约 6页
- 2023-09-16 发布于浙江
- 举报
医疗软件技术基础
实验二
专业名称: 生物医学工程 实验学时: 2
学 号: 姓 名:
实验题目:二叉树的应用-哈夫曼编码的实现
实验环境: vs2008
实验目的:
1.掌握二叉树的定义;
2.掌握哈夫曼树和哈夫曼编码算法的实现。
实验内容:
实现一个哈夫曼编码系统,系统包括以下功能:
(1) 字符信息统计:读取待编码的源文件SourceFile.txt,统计出现的字符及其频率。
(2) 建立哈夫曼树:根据统计结果建立哈夫曼树。
(3) 建立哈夫曼码表:利用得到的哈夫曼树,将各字符对应的编码表保存在文件Code.txt中。
(4) 对源文件进行编码:根据哈夫曼码表,将SourceFile.txt中的字符转换成相应的编码文件ResultFile.txt。
实验流程图
输出字符编码
输出字符编码
结束
输入一串要压缩的字符串
统计个字符串的频率
建立哈夫曼树
开始
实验要求:
(1) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。
(2) 程序要添加适当的注释,程序的书写要采用缩进格式。
实验代码:
#include stdio.h
#includestdlib.h
#includestring.h
#includemap
#include fstream
#includeiostream
#define MAXN 50
using namespace std;
typedef char **HuffmanCode;
typedef struct{
char zimu;
int weight;
int parent, lchild, rchild;
}HTNode,*HuffmanTree;
HuffmanTree HT;//树,声明
HuffmanCode HC;//节点,声明
int m,s1,s2,start,c,f;
char *cd;
int z[30];//统计权
int h[30];
//int weight[MAXN] ;//权重
char u[30];
char u_1[30];
void Select(HuffmanTree HT,int n,int s1,int s2)//Select函数,s1,s2其实没有必要
{
int min1 =0x3f3f3f3f;
int min2 =0x3f3f3f3f;//这里不管,这样写是为了开始必然进入循环
for(int i=1;i=n;i++)//选中最小的权的两个,返回给s1,s2
{
if(HT[i].parent) continue;//不是根节点
if(HT[i].weight min1)
{
min1 = HT[i].weight;
s1 = i;
continue;
}
if(HT[i].weight min2 HT[i].weight = min1)
{
min2 = HT[i].weight;
s2 = i;
}
}
}
void CreatHuffmanTree(HuffmanTree HT ,int n ) //n统计字符数
{
if ( n = 1 ) return;
int m = 2 * n ;//字符数的两倍
HT = new HTNode[m+1] ;//指向大小
for (int a = 1 ; a = m ; a ++ )
{
HT[a].parent = HT[a].lchild = HT[a].rchild = HT[a].weight = 0;
}
for (int j = 1 ; j = n ; j ++ )
{
HT[j].weight = h[j]; //权值传递????
HT[j].zimu = u[j];
}
int s1 ,s2 ;
for (int i = n + 1 ; i = m ; i ++ ) //次数与上面的相同,父亲节点的
原创力文档

文档评论(0)