资源简介
问题描述:对任意输入的一段英文,为每个字符编制其相应的赫夫曼编码;并利用该编码为任意输入的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整合
- 下一篇:雪花圣诞礼物
相关资源
- 二叉树基本操作源代码
- 数据结构图形化演示,里面有动态查
- 二叉树遍历图形化演示
- 数据结构经典算法代码实现
- 经典算法flash动画演示
- 根据二叉树的抽象数据类型的定义,
- 基于平衡二叉树实现的用户登入系统
- 数据结构与算法综合实验—二叉树与
- btree.zip实现二叉树的可视化处理,很
- 实现二叉树的可视化处理,很好的源
- 《数据结构与算法》第四次课内容安
- 山东大学软件学院数据结构实验五二
- 期权定价公式二叉树推导与分析
- 数据结构课程设计线索二叉树
- 五个汇编小程序,乘法表,俄罗斯方
- 数据结构综合课设二叉树的建立与遍
- 数据结构实验报告8-树-求二叉树先序
- 树的基本运算:创建树;输出树凹入
- 平衡二叉树旋转操作,插入,删除,
- 二叉树课程设计
- 对任意输入的一段英文,为每个字符
- ——搜索二叉树的插入,查找和删除
- 二叉树的实现各种遍历算法
- 前缀和后缀表达式建二叉树
- 数据结构课程设计二叉树的非递归遍
- 二叉树三种遍历动画演示
- 树与二叉树相互转换 树的遍历 源代码
- 数据结构二叉树家谱管理系统
- 数据结构关于二叉树的各种算法
- 数据结构课程设计 线索二叉树
评论
共有 条评论