📄 aaaa.cpp
字号:
#include<iostream>
#include<string>
using namespace std;
typedef int * intzhi;
typedef struct
{
char a;
int quan;
}Data,*Dzhi;
typedef struct
{
Data weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char** HuffmanCode;
///函数一查找最小的两个数的序号
void Select(HuffmanTree A,int n,int &a1,int &a2)
{
int i,t,tt,j,a3;
for( i=1;i<=n;i++)
{
if(A[i].parent!=0) continue;
else
{
for(int j=i+1;j<=n;j++)
{
if(A[j].parent!=0) continue;
else
{
if(A[i].weight.quan<=A[j].weight.quan) t=i;
else
{
t=j;
break;
}
}
}
i=j-1;
}
}
a1=t;////找到最小的数
/////////
for(i=1;i<=n;i++)
if(A[i].parent!=0||i==a1) continue;
if(i==n+1) a3=n;//////liumangzuofa
for(i=1;i<=n;i++)
{
if(A[i].parent!=0||i==a1) continue;
else
{
for( j=i+1;j<=n;j++)
{
if(A[j].parent!=0||j==a1) continue;
else
{
if(A[i].weight.quan<=A[j].weight.quan) tt=i;
else
{
tt=j;
break;
}
}
}
i=j-1;
}
}
a2=tt;
if(a2<0)
a2=a3;
}
//函数二编码函数
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,Dzhi w,int n)
{
if(n<=1) return;
int m=2*n-1;
HT=new HTNode[m+1];
HuffmanTree p;
int i,s1=0,s2=0;
for(p=HT+1, i=1;i<=n;++i,++p,++w) ///0号单元未用
{
p->weight.a =w->a ;
p->weight.quan =w->quan ;
p->lchild =0;
p->parent =0;
p->rchild =0;
}
for(i=n+1;i<=m;++i,++p)
{
p->lchild =0;
p->parent =0;
p->rchild =0;
}
for(i=n+1;i<=m;++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.quan=HT[s1].weight.quan+HT[s2].weight.quan;
}
HC=(HuffmanCode) malloc ((n+1)*sizeof (char*));///指向char型指针的指针
char* cd=new char[n];
cd[n-1]='\0';
for(i=1;i<=n;++i)
{
int start=n-1,c,f;
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]=(char*)new char[n-start];
strcpy(HC[i],&cd[start]);////HC放译码
}
delete (cd);
}
///函数三////译码函数
void translate( HuffmanTree B,int n,intzhi &z)////n是叶子结点的个数 变量是整形指针的引用
{
int i=0,j=0,t,a4=0;
int p,b;
b=2*n-1;
p=b;///根结点的序号
char s[100];
z=new int[100];
cout<<"请输入要译码的编码"<<endl;
cin>>s;
while(s[i]!=NULL)
{
while(B[p].lchild!=0 || B[p].rchild!=0)
{
t=i;
if(s[i]=='0') p=B[p].lchild;
else if
(s[i]=='1') p=B[p].rchild;
else if(s[i]==NULL) break;////else if的用法不能只写if !!!!!!!!!!!!!!!!!!!!
i++;
}
if(i==t)
{
cout<<"输入的译码有误,不能完全编译,部分的编译为:"<<endl;
break;
}
z[j++]=p;
p=b;//重新回到根结点
}
}
void main()
{
int a1,a2=1,a3=0;
cout<<"请输入要建立哈夫曼树的字符个数:"<<endl;
cin>>a1;
Data zifu[50];
cout<<"请依次输入字符和权值:"<<endl;//存储从0开始
for(int i=0;i<a1;i++)
cin>>zifu[i].a >>zifu[i].quan ;
Dzhi ww=zifu;
HuffmanTree HT1;
HuffmanCode HC1;
HuffmanCoding(HT1,HC1,ww,a1);
/////////////以上建立了哈夫曼树并实现了编码//////////
while(a2++)
{
cout<<"请选择您所需要的操作:p:为打印编码。d:为译码并输出。q:为退出"<<endl;
char AA;
cin>>AA;
if(AA=='q') break;
switch(AA)
{
case 'p':
{
for(i=1;i<=a1;i++)
{
cout<<HC1[i];
}
cout<<endl;
break;
}
case 'd':
{
int *n1;
translate( HT1,a1,n1);
int j=0,t;
while(n1[j]>0 )////(n1[j]!=NULL;不行
{
if(a3%10==0) cout<<endl;
t=n1[j++];
cout<<zifu[t-1].a ;///从T-1开始算
a3++;
}
cout<<endl;
break;
}
}
}
delete HT1,HC1;////////delete n1;?
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -