没有合适的资源?快使用搜索试试~ 我知道了~
1.初始化:从文件humanWeight.txt( 程序运行时,由用户输入 )读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,将它存于文件hufTr ee.txt中。 2.编码:利用已建好的哈夫曼树(如不在内存,则从文件hufTree.txt中读入)对 文件tobebin.txt字符集中的每一个进行编码,将结果放在codefile.txt 中。 3.译码:利用已建好的哈夫曼树将 codefile.txt 中的代码进行译码,结果保存在textfile.txt 中。 4.印代码文件。将文件 codefile.txt 以紧凑的格式显示在终端上,每行50个代码。同时将结果保存在 codeprint.txt 中。 二.概要设计: 1.哈夫曼树的抽象数据类型定义: ADT haffman { 数据对象:D={ai"ai为charnode型的结点,i=1,2,3,……n,n>0} 数据关系:R={<ai,ai.Lchild><ai,ai.Rchild>"ai是D上的元素} } ADT haffman 2.编码集结构体的抽象数据类型的定义: ADT code { 数据对象:D1={ai" ai
资源推荐
资源详情
资源评论
实习报告-哈夫曼编码
.
1.初始化:从文件 humanWeight.txt( 程序运行时,由用户输入 )读入字符集大小 n,以
及 n 个字符和 n 个权值,建立哈夫曼树,将它存于文件 hufTree.txt 中。
2.编码:利用已建好的哈夫曼树(如不在内存,则从文件 hufTree.txt 中读入)对 文件
tobebin.txt 字符集中的每一个进行编码,将结果放在 codefile.txt 中。
3.译码:利用已建好的哈夫曼树将 codefile.txt 中的代码进行译码,结果保存在
textfile.txt 中。
4.印代码文件。将文件 codefile.txt 以紧凑的格式显示在终端上,每行 50 个代
码。同时将结果保存在 codeprint.txt 中。
二.概要设计:
1.哈夫曼树的抽象数据类型定义:
ADT haffman
{ 数据对象:D={ai|ai 为 charnode 型的结点,i=1,2,3,……n,n>0}
数据关系:R={<ai,ai.Lchild><ai,ai.Rchild>|ai 是 D 上的元素}
} ADT haffman
2.编码集结构体的抽象数据类型的定义:
ADT code
{ 数据对象:D1={ai| ai 是 charlink 型的结点,i=1,2,……n,n>0}
D2={bi|bi 是 codelink 型的结点,i=1,2,……n,n>0}
数据关系: R1={<ai,ai.next>|ai 是 D1 上的元素}
R2={<bi,bi.next>|bi 是 D2 上的元素}
} ADT code
3.程序分为四个部分:
1)读入字符集以及相应频度,建立哈夫曼树。
2)根据哈夫曼树得到每一个字符的哈夫曼编码。
3)读入要编码的字符串,根据哈夫曼树和编码集求出字符串的哈夫曼编码。
4)根据哈夫曼编码和哈夫曼树得到字符串。
三.详细设计:
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////zy
//
// 赫夫曼编/译码器
// 朱勇 13011090
//
////////////////////////////////////////////////////////////////////////////////
///////////////////
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>
using namespace std;
实习报告-哈夫曼编码
.
///////////////////////////////////////////////////////////
// 赫夫曼树和赫夫曼编码的存储表示
typedef struct {
unsigned int weight;
unsigned int parent , lChild , rChild;
} HTNode , *HuffmanTree; // 动态分配数组存储赫夫曼树
typedef struct {
char ch;
char* hufCh;
} HuffmanCode; // 动态分配数组存储赫夫曼编码表
///////////////////////////////////////////////////////////
// 权值字符结点类型
typedef struct {
char ch;
int wt;
} wElem; // 动态分配数组存储读入字符与权值
///////////////////////////////////////////////////////////
// 赫夫曼编码函数
void HuffmanCoding( HuffmanTree & ,
HuffmanCode * ,
wElem * ,
int );
///////////////////////////////////////////////////////////
// 对文件 tobebin.txt 中的正文进行编码
// 将结果存入 codefile.txt
void EnCoding( HuffmanCode * , const char* );
///////////////////////////////////////////////////////////
// 对文件 codefile.txt 里的代码进行译码
// 将结果存入 textfile.txt
void DeCoding( HuffmanTree ,
HuffmanCode * ,
const char* ,
const int );
///////////////////////////////////////////////////////////
// 对 codefile.txt 里的代码进行编排,显示,打印
void PrintCode( const char* , const char* );
///////////////////////////////////////////////////////////
// 选择两个最小的结点
void SelectTwoNode( HuffmanTree , int , int& , int& );
int main()
{
//
实习报告-哈夫曼编码
.
// 用文件流对象 hufInPut 打开外部文件
// humanWeight.txt 储存字符集大小 n ,以及 n 个字符和 n 个权值
ifstream hufInPut( "humanWeight.txt" , ios::in );
int hufNum = 0;
hufInPut >> hufNum; // 读入字符集大小 n 到 hufNum
wElem* hufW = new wElem[ hufNum ]; // 分配 n 个字符和 n 个权值的储存空间
for( int ii = 0 ; ii < hufNum ; ii++ )
{
//
// 循环读入字符及其对应的权值
hufInPut >> hufW[ ii ].ch >> hufW[ ii ].wt;
}
hufInPut.close(); // 关闭 humanWeight.txt 文件
HuffmanTree hufT; // 空树
HuffmanCode* hufC = ( HuffmanCode* ) malloc ( ( hufNum + 1 ) *
sizeof( HuffmanCode ) ); // 分配 n 个字符编码的头指针向量
HuffmanCoding( hufT , hufC , hufW , hufNum ); // 编码中...
//
// 用文件流对象 hufTreeOutPut 把赫夫曼树 HT , HC 输出到文件 hufTree.txt 中
ofstream hufTreeOutPut( "hufTree.txt" , ios::out );
hufTreeOutPut << "-- HT ------------------------------- " << endl <<
setw( 9 )
<< " weight " << " parent " << " lchild " << " rchild "
<< endl;
for( int tOut = 1 ; tOut <= 2*hufNum-1 ; tOut++ )
{
hufTreeOutPut << setw( 6 ) << tOut
<< setw( 8 ) << hufT[ tOut ].weight
<< setw( 8 ) << hufT[ tOut ].parent
<< setw( 8 ) << hufT[ tOut ].lChild
<< setw( 8 ) << hufT[ tOut ].rChild << endl;
}
hufTreeOutPut << "-- end HT --------------------------- " << endl << endl
<< "-- HC ------------------------------- " << endl;
for( int cOut = 1 ; cOut <= hufNum ; cOut++ )
{
hufTreeOutPut << " " << hufC[ cOut ].ch << " ---->> " <<
hufC[ cOut ].hufCh << endl;
}
hufTreeOutPut << "-- convert -- ok -------------------- " << endl;
hufTreeOutPut.close(); // 输出完毕,关闭文件
delete [] hufW; // 释放内存
EnCoding( hufC , "tobebin.txt" ); // 对正文编码
剩余11页未读,继续阅读
资源评论
小虾仁芜湖
- 粉丝: 87
- 资源: 9357
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- python-leetcode面试题解之第198题打家劫舍-题解.zip
- python-leetcode面试题解之第191题位1的个数-题解.zip
- python-leetcode面试题解之第186题反转字符串中的单词II-题解.zip
- 一个基于python的web后端高性能开发框架,下载可用
- python-leetcode面试题解之第179题最大数-题解.zip
- python-leetcode面试题解之第170题两数之和III数据结构设计-题解.zip
- python-leetcode面试题解之第168题Excel表列名称-题解.zip
- python-leetcode面试题解之第167题两数之和II输入有序数组-题解.zip
- python-leetcode面试题解之第166题分数到小数-题解.zip
- python-leetcode面试题解之第165比较版本号-题解.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功