资源简介
问题描述:对任意输入的一段英文,为每个字符编制其相应的赫夫曼编码;并利用该编码为任意输入的0、1序列进行解码.
基本要求:一个完整的系统应具有以下功能:
(1)初始化 从终端读入一段英文字符,统计每个字符出现的频率,建立赫夫曼树,并将该树存入某文件;
(2)编码 利用建好的赫夫曼树对各字符进行编码,用列表的形式显示在屏幕上,并将编码结果存入另一文件中;
(3)解码 利用保存的赫夫曼编码,对任意输入的0,1序列能正确解码;
代码片段和文件信息
#include
#include
#include
#include
#include
#define STRLEN 70
using namespace std;
typedef struct
{
unsigned int weight;
unsigned int parentlchildrchild;
char letter;
}HTNode*HuffmanTree;
typedef char * * HuffmanCode;
typedef struct
{
char letter;
int times;
int weight;
}Character*String;
void Frequency(String &strint &count)
{
char ch;
int ijk;
str=(String)malloc((STRLEN+1)*sizeof(Character));
ch=getchar();
if(ch==‘\n‘){cout<<“输入为空!“< str[1].letter=ch;str[1].times=1;
count=1;
i=2;
h:for(;i<=STRLEN;++i)
{
ch=getchar();
if(ch==‘\n‘)break;
for(j=1;j<=count;j++)
if(str[j].letter==ch){str[j].times++;goto h;}
str[++count].letter=ch;
str[count].times=1;
}
for(k=1;k<=count;k++)
str[k].weight=100*str[k].times/(i-1);
}
void Select(HuffmanTree Tint nint &s1int &s2)
{
int imin1min2;
for(i=1;i<=n;i++)
{
if(T[i].parent==0)
{
min1=T[i].weight;
s1=i;
break;
}
}
for(i=1;i<=n;i++)
{
if(T[i].parent==0&&T[i].weight {
min1=T[i].weight;
s1=i;
}
}
for(i=1;i<=n;i++)
{
if(T[i].parent==0&&i!=s1)
{
min2=T[i].weight;
s2=i;
break;
}
}
for(i=1;i<=n;i++)
{
if(i==s1)continue;
if(T[i].parent==0&&T[i].weight {
min2=T[i].weight;
s2=i;
}
}
}
void HuffmanCoding(HuffmanTree &HTHuffmanCode &HCString strint n)
{
int mijs1=1s2=1startcf;
HTNode *p;char *cd;
ofstream htreehcode;
htree.open(“huffmantree.txt“);
hcode.open(“huffmancode.txt“);
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
p=HT;
for(i=1;i<=n;++i)
{
p[i].weight=str[i].weight;
p[i].letter=str[i].letter;
p[i].parent=0;p[i].lchild=0;p[i].rchild=0;
}
for(;i<=m;++i)
{
p[i].weight=0;p[i].parent=0;
p[i].lchild=0;p[i].rchild=0;
}
for(i=n+1;i<=m;++i)
{
Select(HTi-1s1s2);
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;
}
for(i=1;i<=m;i++)
{
if(i<=n)
htree< else
htree<<“* “< }
htree.close();
HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
cd=(char *)malloc(n*sizeof(char));
cd[n-1]=‘\0‘;
for(i=1;i<=n;++i)
{
start=n-1;
for(c=if=HT[i].parent;f!=0;c=ff=HT[f].parent)
if(HT[f].lchild==c)cd[--start]=‘0‘;
else cd[--start]=‘1‘;
HC[i]=(char *)malloc((n-start)*sizeof(char));
strcpy(HC[i]&cd[start]);
}
cout<<“对应的哈弗曼编码是:“< for(i=1;i<=n;i++)
{
cout< for(j=0;HC[i][j]!=‘\0‘;j++)
cout< cout< }
for(i=1;i<=n;i++)
{
hcode< for(j=0;HC[i][j]!=‘\0‘;j++)
hcode< hcode< }
hcode.close();
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4065 2010-05-18 13:42 实验3\5323.cpp
文件 3377 2010-11-05 14:18 实验3\5323.dsp
文件 48640 2010-11-05 14:18 实验3\5323.opt
文件 242 2010-11-05 14:18 实验3\5323.plg
文件 561217 2010-05-18 13:49 实验3\Debug\5323.exe
文件 804948 2010-05-18 13:49 实验3\Debug\5323.ilk
文件 257052 2010-05-18 13:49 实验3\Debug\5323.obj
文件 2108020 2010-05-13 19:50 实验3\Debug\5323.pch
文件 1123328 2010-05-18 13:49 实验3\Debug\5323.pdb
文件 74752 2010-11-05 14:18 实验3\Debug\vc60.idb
文件 110592 2010-05-18 13:49 实验3\Debug\vc60.pdb
文件 24 2010-11-05 14:18 实验3\huffmancode.txt
文件 87 2010-11-05 14:18 实验3\huffmantree.txt
目录 0 2010-05-18 13:49 实验3\Debug
目录 0 2010-11-05 14:18 实验3
----------- --------- ---------- ----- ----
5096344 15
- 上一篇:springboot与netty整合
- 下一篇:雪花圣诞礼物
相关资源
- 线索二叉树的建立遍历(非递归前中
- 数据结构 建立二叉树二叉链表存储结
- 二叉树指定第i层输出以及打印叶子结
- 求二叉树最大宽度 求二叉树最大宽度
- 二叉树先序、中序、后序三种遍历的
- 用二叉树实现学生健康情况管理系统
- 平衡二叉树完整代码创建,插入,旋
- 由俩中遍历序列恢复二叉树
- 广州大学 数据结构实验报告 实验二
- 数据结构试验3-二叉树实验报告含源码
- 用二叉树表示家谱关系并实现各种查
- 二叉树需要的的5个基本操作运算
- 树与二叉树的转换
- 数据结构二叉树实验报告源代码及运
- c编写的数据结构创建顺序表、链表、
- 数据结构算法二叉树实现
- 根据输入一组数据,建立有序二叉树
- 二叉树遍历实验报告
- 广工数据结构课程设计实验-二叉树的
- 面试题目集锦--二叉树
- 二叉排序树与平衡二叉树的实现
- 华科计算机学院数据结构二叉树实验
- 打印二叉树形状 画二叉树的图
- 二叉树的三种遍历swf
- 用二叉树实现中缀表达式转换成后缀
- 数据结构:二叉树的应用
- 数据结构实验报告7-树-二叉树的字符
- 数据结构实验报告6-树-二叉树的遍历
- 第六章 树和二叉树作业及答案100分
- 二叉树算法计算表达式
评论
共有 条评论