⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 实习5.2.cpp

📁 哈夫曼编码,实现了哈夫曼编码中的编码,译码,以及打印的功能.
💻 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 + -