哈夫曼编码
班级:2012计算机科学与技术 姓名: 学号: 日期:2013/12/18
一、 需求分析
1 、输入:输入字符串。
2、输出:哈夫曼编码。
3、功能:初始化,读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存入哈夫曼中。编码,利用已经建立好的哈夫曼树将文件进行编码。
3、测试数据:
5
1 2 3 4 5
q w e r t
5
q w e r t
二、 概要设计
(1)类定义以及主要操作。
typedef struct{
int weight;
int parent,lchild,rchild;
char data;
}HTNode,*HuffmanTree;
typedef char**HuffmanCode;
void select(HuffmanTree &HT,int n,int &s1,int &s2); //找权值最小的下标 void CreatHuffman(HuffmanTree &HT,int *w,char *d,int n);
void HuffmanCodes(HuffmanTree &HT,HuffmanCode &HC,int n);
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int m); //将要编码的字符串存入空树中
(2)主函数测试。
int main()
{
HuffmanTree h;
HuffmanCode c;
int w[100];
char d[100];
cout
cin>>n;
cout
for(i=1;i
}
{ cin>>w[i]; } cout>d[i]; } CreatHuffman(h,w,d,n); HuffmanCodes(h,c,n); cout>m; HuffmanCoding(h,c,m); cout
三、 详细设计
见附录。
四、 调试分析
1、
五、用户使用说明
1、注意按提示输入数据。
六、测试结果
1、输入与输出:
七、附录(完整代码)
//==================================================================== // 哈夫曼编码
//--------------------------------------------------------------------
// 使用方法:略
//--------------------------------------------------------------------
// 姓名: 学号: QQ:1794559417 2013/12/18
//==================================================================== #include
#include
using namespace std;
//-----类、函数声明--------------------
typedef struct{
int weight;
int parent,lchild,rchild;
char data;
}HTNode,*HuffmanTree;
//-------------
typedef char**HuffmanCode;
//-------------
void select(HuffmanTree &HT,int n,int &s1,int &s2); //找权值最小的下标
void CreatHuffman(HuffmanTree &HT,int *w,char *d,int n);
void HuffmanCodes(HuffmanTree &HT,HuffmanCode &HC,int n);
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int m); //将要编码的字符串存入空树中
//-----全局数据定义--------------------
int i,j,n,m;
//-----主函数----------------------------------------------
int main()
{
HuffmanTree h;
HuffmanCode c;
int w[100];
char d[100];
cout>n; cout>w[i]; } cout
} { cin>>d[i]; } CreatHuffman(h,w,d,n); HuffmanCodes(h,c,n); cout>m; HuffmanCoding(h,c,m); cout
//=====函数实现======================================================= void select(HuffmanTree &HT,int n,int &s1,int &s2)
{
s1=0;s2=0;
int n1=30000,n2=30000;
for(int i=1;i
{
if(HT[i].parent==0)
{
if(HT[i].weight
{
n2=n1;
n1=HT[i].weight;
s2=s1;
s1=i;
}
else
if(HT[i].weight
{
n2=HT[i].weight;
s2=i;
}
}
}
}
//---------------
void CreatHuffman(HuffmanTree &HT,int *w,char *d,int n)
{
int m,i,s1,s2;
m=n*2-1;
HT=new HTNode[m+1];
for(i=1;i
{
HT[i].weight=w[i];
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].data=d[i];
}
for(i=n+1;i
{
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].data=' ';
}
for(i=n+1;i
{
select(HT,i-1,s1,s2);
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;
}
}
//---------------
void HuffmanCodes(HuffmanTree &HT,HuffmanCode &HC,int n) {
HC=(HuffmanCode)malloc((n+1)*sizeof(char *)); char *cd;
cd=new char[n+1];
int i,start,c,f;
cd[n-1]='\0';
for(i=1;i
{
start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
HC[i]=new char[n-start];
strcpy(HC[i],&cd[start]);
}
cout
cout
}
delete (cd);
}
//----------------
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int m) {
HC=(HuffmanCode)malloc((n+1)*sizeof(char *)); char *cd;
cd=new char[n+1];
char *zifu;
zifu= new char[m+1];
int i,start,c,f;
cd[n-1]='\0';
for(i=1;i
{
start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
HC[i]=new char[n-start];
strcpy(HC[i],&cd[start]);
}
cout>zifu[i]; } cout
} } }
delete (cd); }
//=====结束===========================================================
哈夫曼编码
班级:2012计算机科学与技术 姓名: 学号: 日期:2013/12/18
一、 需求分析
1 、输入:输入字符串。
2、输出:哈夫曼编码。
3、功能:初始化,读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存入哈夫曼中。编码,利用已经建立好的哈夫曼树将文件进行编码。
3、测试数据:
5
1 2 3 4 5
q w e r t
5
q w e r t
二、 概要设计
(1)类定义以及主要操作。
typedef struct{
int weight;
int parent,lchild,rchild;
char data;
}HTNode,*HuffmanTree;
typedef char**HuffmanCode;
void select(HuffmanTree &HT,int n,int &s1,int &s2); //找权值最小的下标 void CreatHuffman(HuffmanTree &HT,int *w,char *d,int n);
void HuffmanCodes(HuffmanTree &HT,HuffmanCode &HC,int n);
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int m); //将要编码的字符串存入空树中
(2)主函数测试。
int main()
{
HuffmanTree h;
HuffmanCode c;
int w[100];
char d[100];
cout
cin>>n;
cout
for(i=1;i
}
{ cin>>w[i]; } cout>d[i]; } CreatHuffman(h,w,d,n); HuffmanCodes(h,c,n); cout>m; HuffmanCoding(h,c,m); cout
三、 详细设计
见附录。
四、 调试分析
1、
五、用户使用说明
1、注意按提示输入数据。
六、测试结果
1、输入与输出:
七、附录(完整代码)
//==================================================================== // 哈夫曼编码
//--------------------------------------------------------------------
// 使用方法:略
//--------------------------------------------------------------------
// 姓名: 学号: QQ:1794559417 2013/12/18
//==================================================================== #include
#include
using namespace std;
//-----类、函数声明--------------------
typedef struct{
int weight;
int parent,lchild,rchild;
char data;
}HTNode,*HuffmanTree;
//-------------
typedef char**HuffmanCode;
//-------------
void select(HuffmanTree &HT,int n,int &s1,int &s2); //找权值最小的下标
void CreatHuffman(HuffmanTree &HT,int *w,char *d,int n);
void HuffmanCodes(HuffmanTree &HT,HuffmanCode &HC,int n);
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int m); //将要编码的字符串存入空树中
//-----全局数据定义--------------------
int i,j,n,m;
//-----主函数----------------------------------------------
int main()
{
HuffmanTree h;
HuffmanCode c;
int w[100];
char d[100];
cout>n; cout>w[i]; } cout
} { cin>>d[i]; } CreatHuffman(h,w,d,n); HuffmanCodes(h,c,n); cout>m; HuffmanCoding(h,c,m); cout
//=====函数实现======================================================= void select(HuffmanTree &HT,int n,int &s1,int &s2)
{
s1=0;s2=0;
int n1=30000,n2=30000;
for(int i=1;i
{
if(HT[i].parent==0)
{
if(HT[i].weight
{
n2=n1;
n1=HT[i].weight;
s2=s1;
s1=i;
}
else
if(HT[i].weight
{
n2=HT[i].weight;
s2=i;
}
}
}
}
//---------------
void CreatHuffman(HuffmanTree &HT,int *w,char *d,int n)
{
int m,i,s1,s2;
m=n*2-1;
HT=new HTNode[m+1];
for(i=1;i
{
HT[i].weight=w[i];
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].data=d[i];
}
for(i=n+1;i
{
HT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].data=' ';
}
for(i=n+1;i
{
select(HT,i-1,s1,s2);
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;
}
}
//---------------
void HuffmanCodes(HuffmanTree &HT,HuffmanCode &HC,int n) {
HC=(HuffmanCode)malloc((n+1)*sizeof(char *)); char *cd;
cd=new char[n+1];
int i,start,c,f;
cd[n-1]='\0';
for(i=1;i
{
start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
HC[i]=new char[n-start];
strcpy(HC[i],&cd[start]);
}
cout
cout
}
delete (cd);
}
//----------------
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int m) {
HC=(HuffmanCode)malloc((n+1)*sizeof(char *)); char *cd;
cd=new char[n+1];
char *zifu;
zifu= new char[m+1];
int i,start,c,f;
cd[n-1]='\0';
for(i=1;i
{
start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
HC[i]=new char[n-start];
strcpy(HC[i],&cd[start]);
}
cout>zifu[i]; } cout
} } }
delete (cd); }
//=====结束===========================================================