当前位置: 代码迷 >> C语言 >> 求助一下 关于 哈夫曼编码译码器
  详细解决方案

求助一下 关于 哈夫曼编码译码器

热度:486   发布时间:2008-06-10 17:26:10.0
求助一下 关于 哈夫曼编码译码器
设计要求:打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。    

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


拜托大虾给出完整正确的答案 即 源代码

谢谢了
搜索更多相关的解决方案: 译码器  哈夫曼编码  二进制  源代码  

----------------解决方案--------------------------------------------------------
像是数据结构大作业



[color=white]
----------------解决方案--------------------------------------------------------
拜托了啊  大哥哥
----------------解决方案--------------------------------------------------------
幸好不是叫我。。。闪人。。。吃饭去了。。。。



[color=white]
----------------解决方案--------------------------------------------------------
帮帮忙啊
----------------解决方案--------------------------------------------------------
顶上去啊
----------------解决方案--------------------------------------------------------
什么时候要交?
----------------解决方案--------------------------------------------------------
这个题目先统计字符数。。然后从小到大排序。。建树,为所有叶子节点构造最优前缀码。。写入文件。。读入的时候替换。。你可以自己写下
----------------解决方案--------------------------------------------------------
[bo][un]zjl138[/un] 在 2008-6-10 19:10 的发言:[/bo]

什么时候要交?

同问


[color=white]
----------------解决方案--------------------------------------------------------
我写了个大概。。。还是要你自己写得。你看看吧。。
// bt.cpp: 主项目文件。

#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[i]='\0';
        for(int i=0;i<128;i++)
        if(c[i]!=0)
        {
            Ht[j].ch=i;
            Ht[j].weight=c[i];
            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[i].parent=j+k;
                Ht[i+1].parent=j+k;
                Ht[j+k].weight=Ht[i+1].weight+Ht[i].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[i].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[i],Ht[i].ch);
          }
      }
      void ctob()
      {   int i=0;
          while(ch[i]!='\0')
          {
              for(int k=1;k<j;k++)
                  if(ch[i]==Ht[k].ch)
                  {
                      printf("%s  ",Hc[k]);
                      break;
                  }
                  i++;
          }
      }

};
int main()
{
    htree h;
    h.Init();
    h.leafcode();
    h.ctob();
    system("pause");
    return 0;
}
要是有什么问题,可以一起讨论。。我没怎么测试。。
----------------解决方案--------------------------------------------------------
  相关解决方案