赫夫曼编码译码器(数据结构)

原创 2011年01月11日 21:50:00

#include"stdio.h"
#include"malloc.h"
#include"string.h"
#define M 27
#define MZ 1000
 typedef struct
 {
 unsigned int w;
 unsigned int parent,lchild,rchild;
 char info;

 }Huf,*HufTree;
 typedef struct
 {
  HufTree HT;
     char ** Huffcode;
 }store;
 typedef char ** Huffcode;
 
 void init(char Noc[],int wc[])
 {
  for(int i=0;i<M;i++)
  {
     printf("输入字符:");
  Noc[i]=getchar();
  getchar();
        printf("输入权直:");
  scanf("%d",wc+i);
  getchar();

  }
 
 }
 void select(HufTree HT,int n,int *s1,int *s2)
 { 
   int m1,m2;
   m1=3000;
         m2=3000;
      int i;
 
  for(i=1;i<=n;i++)
  { 
   if(HT[i].parent ==0)
   { if(HT[i].w<m1) { m1=HT[i].w;*s1=i;}
     else
    if(HT[i].w<m2){m2=HT[i].w;*s2=i;}
   }
  }

 }
 store Huffmancode(HufTree HT,Huffcode HC,int *w,int n,char code[])
 {   
  int i=0,s1,s2;
  char *cd;
  s1=2;
  s2=1;
  Huf *p;
  int m;
  //if(n<=1) return ;
  m=2*n-1;
   store st;
    
  HT=(Huf *)malloc((m+1)*sizeof(Huf));
 
  HT[0].lchild=0;
  HT[0].parent=0;
  HT[0].rchild=0;
  HT[0].w=0;
  HT[0].info=code[0];
  for(p=HT+1,i=1;i<=n;++i,++p,++w)
  {
   p->w=*w;
   p->lchild =0;
   p->parent=0;
   p->rchild=0;
      p->info=code[i-1];
  }
    
  for(;i<=m;++i,++p)
  {
   p->lchild=0;
   p->parent=0;
   p->rchild=0;
   p->w=0;
   HT[i].info='*';
  
  }

     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].w=HT[s1].w+HT[s2].w;
  
     
  }
    
  int start,c,f;
  HC=(Huffcode)malloc((n+1)*sizeof(char *));
     cd=(char *)malloc(n*sizeof(char));
  cd[n-1]='/0';
  for(i=1;i<=n;++i)
  {
   start=n-1;
   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*)malloc((n-start)*sizeof(char));
   
    strcpy(HC[i],cd+start);
   
 //printf("%c/n",HT[i].info);

  }
 
  free(cd);
     st.HT=HT;
  st.Huffcode=HC;
  return st;

}

 int fcode(char Noc[],store *st)
 {
  char code[MZ];
  int n=0;
     int low=0,high=26;
     int mid,i=0;
    
  printf("===========请输入你要编码的数据(一次最多可以编码1000个字符)============/n");
     printf("|                     注意以*字符为结束标志                           |/n");
  printf("=======================================================================/n");
     //scanf("%s",code);
  getchar();
  gets(code);

    
 while(i<1000)
  {
  
   if(code[i]=='*') return 0;
     
     low=0;
     high=26;
     while(low<=high)
     {
          mid=(low+high)/2;
       if(Noc[mid]==code[i]){ printf("%s",st->Huffcode[mid+1]);break;}
        else
     {   
      if(Noc[mid]>code[i]) high=mid-1;
               else low=mid+1;
     }
     }
  
  i++;

 }
   printf("/n");
  return 0;
 }
 int uncode(store *st,int m)
 {
  char code[1000];
  int n=0,i=0;
  n=m;
  printf("==========================输入你要译码的数据===================/n");
  printf("|                  注意以*字符为结束标志                   |/n");
  printf("===============================================================/n");
     scanf("%s",code);
 
     while(true)
  {
   if(code[i]=='*')break;
   if(code[i]=='0')
    n=st->HT[n].lchild;
   else
    n=st->HT[n].rchild;

   if(st->HT[n].info!='*')
   {
    printf("%c",st->HT[n].info);
       n=m;
   
   }
  
   i++;
  }
  printf("/n");
  return 0;
 }
void print(store *st,char Noc[])
{
   for(int i=0;i<M;i++)
   { 
        printf("==================================/n");
           printf("==%c=的编码为:",Noc[i]);
           printf("%s/n",st->Huffcode[i+1]);
   
  
 }
 printf("==================================/n");
}
 int main()
 {
   Huf HT;
   char *HC;
  
   store st;
   char Nocode[M]={' ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
   int WC[M]={186,64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1};
 
   int falg;
   st=Huffmancode(&HT,&HC,WC,M,Nocode);
  
   while(falg!=4)
   {
       printf("         ====================功能选项==================/n");
    printf("         | =编码是1=  =译码是2= =编码表3= =退出请选4= |/n");
       printf("         ==============================================/n");
    printf("         输入值:");
       scanf("%d",&falg);
       switch(falg)
    {
         case 1:fcode(Nocode,&st);break;
         case 2:uncode(&st,2*M-1);break;
   case 3:print(&st,Nocode);break;
         case 4:printf("谢谢你的使用!/n");break;
    }
   }
   return 0;


 }

赫夫曼编码/译码器

#include #include #include #include #define NULL 0#define OK 1#define ERROR 0#define OVERFLOW -2#def...
  • fabio210
  • fabio210
  • 2006年01月02日 22:10
  • 2827

数据结构:赫夫曼树和赫夫曼编码的存储表示

/******************************************************** 程序:赫夫曼树和赫夫曼编码的存储表示 完成者:小单 完...
  • s634772208
  • s634772208
  • 2015年05月08日 15:00
  • 1624

c语言实现赫夫曼树的构建以及生成赫夫曼编码(《数据结构》算法6.12)

这个程序是根据《数据结构》算法6.12用c语言实现的程序,赫夫曼树就不多说了,直接看代码,代码上都有注释。 下面代码: #include #include #include #include #i...
  • L_BestCoder
  • L_BestCoder
  • 2016年02月16日 15:21
  • 2438

赫夫曼树的构建、编码、译码解析

当你开始看这篇博文的时候,我相信你对树及二叉树的基本概念已有所了解,我在这里就不再赘述。我们主要对赫 夫曼树的特点、构建、编码、译码做一个详细的介绍,并附有代码,所有函数代码都通过了测试,我不保证所...
  • heart_love
  • heart_love
  • 2016年03月16日 08:45
  • 4264

数据结构课程设计--哈夫曼树编

#include #include #include #include #include #define MAXV 100 //#define MAXVALUE 10000 t...
  • xuan_xinya
  • xuan_xinya
  • 2013年04月01日 19:01
  • 1019

哈夫曼编码与译码器

题目:哈夫曼编译码系统(Huffman) ① 问题描述:给定n个字符的全值数组w,根据哈夫曼编码与译码规则,实现一个哈夫曼编译码系统(利用实验指导书上的27个字符的数据进行实验)。 ② 利用顺序表...
  • Smile_7x
  • Smile_7x
  • 2012年12月16日 16:14
  • 3470

数据结构——赫夫曼编码

效果如下:   源程序如下: #include #include #include typedef struct {   int weight;   int parent,lc...
  • tianse12
  • tianse12
  • 2015年07月28日 15:14
  • 431

数据结构赫夫曼编码

#include #include #include #include typedef struct {     unsigned int weight;     unsig...
  • onlyyouicare
  • onlyyouicare
  • 2014年09月07日 22:21
  • 225

2-1 Verilog 3-8 译码器

Verilog 学习过程 3-8译码器
  • hyhop150
  • hyhop150
  • 2016年04月22日 20:31
  • 1976

3-8译码器的设计

问题解决 1.编写程序后编译有错误:使用#在语句前忽略错误。 2.实验原理不太清楚:课下要好好看看原理。 3.文件名必须与VHDL文件中的设计实体名保持一致。 4.思考软件仿真时输入信号应如何设置?:...
  • a1260157543
  • a1260157543
  • 2015年10月18日 14:14
  • 1615
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:赫夫曼编码译码器(数据结构)
举报原因:
原因补充:

(最多只允许输入30个字)