应天论坛

 找回密码
 参与我们

QQ登录

只需一步,快速开始

搜索
查看: 833|回复: 0

哈夫曼编码译码器

[复制链接]

276

主题

303

帖子

3187

积分

管理员

湘南小侠客

Rank: 9Rank: 9Rank: 9

积分
3187

优质服务勋章论坛元老

QQ
发表于 2017-7-12 02:35:45 | 显示全部楼层 |阅读模式
设计要求:打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。   

整个程序的输出是1.哈夫曼码,将英文文章翻译成的二进制代码,二进制代码翻译成英文文章


// bt.cpp: 主项目文件。

[mw_shl_code=cpp,true]#include "stdafx.h"
#include "iostream"
#include "iterator"
#include "String"
#define max 20
using namespace std;
struct node
{
    char ch;
    int weight;
    int parent;
    int lchild,rchild;
}Ht[2*max];
class htree
{
  private:
      int c[128];
      int j;
      int len;
      char **Hc;
      char code[20];
      char ch[1000];
  public:
      htree()
      { j=1;
        int i=0;
        memset(c,0,sizeof(int)*128);
        istream_iterator<char >  p(cin),eof;
        while(p!=eof)
        {   
           ch[i++]=*p;
           c[*p++]++;
        }
        ch='\0';
        for(int i=0;i<128;i++)
        if(c!=0)
        {
            Ht[j].ch=i;
            Ht[j].weight=c;
            Ht[j].lchild=0;
            Ht[j].rchild=0;
            j++;
        }
        
            
      }
      void Init()
      {
         for(int i=1;i<j-1;i++)
            for(int k=1;k<j-1;k++)
                if(Ht[k].weight>Ht[k+1].weight)
                {
                   struct node tmp=Ht[k];
                           Ht[k]=Ht[k+1];
                           Ht[k+1]=tmp;
                }
        for(int i=1,k=0;i<j-1;i++,k++)
        {   if(k==0)
            {
                Ht[j+k].lchild=i;
                Ht[j+k].rchild=i+1;
                Ht.parent=j+k;
                Ht[i+1].parent=j+k;
                Ht[j+k].weight=Ht[i+1].weight+Ht.weight;
            }
            else
            {
                Ht[j+k].lchild=j+k-1;
                Ht[j+k-1].parent=j+k;
                Ht[j+k].rchild=i+1;
                Ht[i+1].parent=j+k;
                Ht[j+k].weight=Ht[i+1].weight+Ht[j+k-1].weight;
            }
          if(i==j-2)
           len=j+k;
            
        }
      }
      void leafcode()
      {
          int i,p=len,cdlen=0;
          Hc=(char * *)malloc(j*sizeof(char *));
          for(int i=1;i<=p;i++)
              Ht.weight=0;
          while(p)
          {
              if(Ht[p].weight==0)
              {
                  Ht[p].weight=1;
                  if(Ht[p].lchild!=0)
                  {
                      p=Ht[p].lchild;
                      code[cdlen++]='0';
                  }
                  else if(Ht[p].rchild==0)
                  {
                      Hc[p]=(char*)malloc((cdlen+1)*sizeof(char));
                      code[cdlen]='\0';
                      strcpy(Hc[p],code);
                  }
               }
              else if(Ht[p].weight==1)
              {
                  Ht[p].weight=2;
                  if(Ht[p].rchild!=0)
                  {
                      p=Ht[p].rchild;
                      code[cdlen++]='1';
                  }
              }
              else
              {
                  Ht[p].weight=0;
                  p=Ht[p].parent;
                  --cdlen;
              }
          }
          for(int i=1;i<j;i++)
          {
              printf("%s=%c   ",Hc,Ht.ch);
          }
      }
      void ctob()
      {   int i=0;
          while(ch!='\0')
          {
              for(int k=1;k<j;k++)
                  if(ch==Ht[k].ch)
                  {
                      printf("%s  ",Hc[k]);
                      break;
                  }
                  i++;
          }
      }

};
int main()
{
    htree h;
    h.Init();
    h.leafcode();
    h.ctob();
    system("pause");
    return 0;
}[/mw_shl_code]
每次见你穿短裤打领带,还穿个拖鞋,下次再这样穿不要从我家门口过了!
http://gsh.yzqz.cn/CassettePlayer/index.html

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 参与我们

本版积分规则

QQ|Archiver|手机版|小黑屋|应天社区 ( 湘ICP备17015224号 )

GMT+8, 2024-5-2 05:52 , Processed in 0.374993 second(s), 27 queries .

Powered by Discuz!

© 2001-2017 Comsenz Inc.


免责声明:
本站所发布的第三方软件及资源(包括但不仅限于文字/图片/音频/视频等仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢某程序或某个资源,请支持正版软件及版权方利益,注册或购买,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To: admin@yzqz.cn

快速回复 返回顶部 返回列表