📄 实习5.2.cpp
字号:
#include<iostream.h>
#include<iomanip.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<list>
#include"HuffmanTree.h"
void menu();
void Out(HuffmanTree HT,HuffmanCode HC,int n)
{
int i;
for(i=1;i<=2*n-1;i++)
cout<<HT[i].data<<" "<<HT[i].w<<" "<<HT[i].parent<<" "
<<HT[i].lchild<<" "<<HT[i].rchild<<endl;
for(i=1;i<=n;i++)
cout<<HC[i]<<endl;
}
int getLocate(HuffmanTree HT,int n,char p)
{
for(int i=1;i<=n;i++)
{
if(HT[i].data==p)
return i;
}
exit(1);
}
void InEncoding(HuffmanTree HT,HuffmanCode HC,int n)
{ //进行编码
char in;
char *ch;
std::list<char> li(1);
std::list<char>::iterator ite=li.begin();
int locate;
cout<<"请输入要编码的字符序列:";
getchar();
while(cin.get(in))
{ //把需要编码的代码存入顺序表li中
if(in=='\n')
break;
li.push_back(in);
}
cout<<"序列编码后为:";
for(ite++;ite!=li.end();ite++)
{ //输出编码
locate=getLocate(HT,n,*ite);
cout<<HC[locate];
}
cout<<endl;
}
void Decoding(HuffmanTree HT,HuffmanCode HC,int n)
{//译码
int length=-1;//length 表示出编码中最长的长度
int i,j,t;
char input[256];//定义输入长度最长为256的字符
for(i=1;i<=n;i++)
{//找出编码最长的长度
j=strlen(HC[i]);
if(length<j)
length=j;
}
cout<<"请输入要译码的0、1序列:";
j=0;
while(1)
{//按字符形式读入01码
cin.get(input[j]);
if(input[j]=='\n')
break;
j++;
}
input[j]='\0';
i=0;
char temp[256];
char Output[256];
int Lengh[256];//对HC[]数组里,取出每个编码的长度
bool isOk=false;
int p=0;//这个变量给Output用的
int tem;
j=i;
int ii;//ii临时变量
for(t=1;t<=n;t++)
{//对HC每个字符编码取长度
Lengh[t-1]=strlen(HC[t]);
}
while(1)
{
if((i!=j)&&(input[j]=='\0'))
{cout<<"此编码未译码完毕,因为存在不能译码元,下面输出不完整的译码序列:"<<endl;
break;
}
tem=0;
ii=i;
for(;ii<=j;ii++)//对input字符操作,从i至j的字符串复制给temp
temp[tem++]=input[ii];
temp[tem]='\0';
for(t=0;t<n;t++)
{
if(Lengh[t]==j-i+1)
{
if(strcmp(temp,HC[t+1])==0)
{
isOk=true;
Output[p++]=HT[t+1].data;
break;
}
}
}
if(isOk==true)
{
i=j+1;//i取下个值
if(input[i]=='\0')
break;
isOk=false;//恢复值
j=i;//j取下个值
}
else
j++;
}
cout<<"译码后为:";
for(i=0;i<p;i++)
{
if(Output[i]==' ')
cout<<" ";
else
cout<<Output[i];
}
cout<<endl;
}
void PrintMenu()
{
cout.width(45);
cout<<"***********************************哈夫曼树实验***********************"<<endl;
cout<<endl;
cout<<" 1.哈夫曼树初始化"<<endl;
cout<<" 2.哈夫曼编码"<<endl;
cout<<" 3.哈夫曼译码"<<endl;
cout<<" 4.打印哈夫曼树代码文件"<<endl;
cout<<" 5.打印哈夫曼树"<<endl;
cout<<" 0.退出"<<endl;
}
void menu()
{
int N;
bool t=false;
int n=0,vlength=0;
HuffmanTree HT;
HuffmanCode HC;
PrintMenu();
while(1)
{
cout<<" 请选择0-5各个功能:";
cin>>N;
switch(N)
{
case 1:Initialization(HT,n);
InEncoding(HT,HC,n);
t=true;
cout<<"初始化完毕!"<<endl;
break;
case 2: if(t){Encoding(HT,HC,n);
cout<<"编码完毕!"<<endl;}
else
cout<<"还未初始化!请先初始化\n";
break;
case 3:getchar();
if(t){Decoding(HT,HC,n);
cout<<"译码完毕"<<endl;}
else
cout<<"还未初始化!请先初始化\n";
break;
case 4:Out(HT,HC,n);
break;
case 5:TreePrint(HT,n);
break;
case 0:return;
default:cout<<"输入有误,请重新输入"<<endl;
}
}
}
int main()
{
menu();
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -