资源简介

问题描述:对任意输入的一段英文,为每个字符编制其相应的赫夫曼编码;并利用该编码为任意输入的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


评论

共有 条评论