霍夫曼树编码的实现

2016-02-19 17:19 1 1 收藏

今天给大家分享的是由图老师小编精心为您推荐的霍夫曼树编码的实现,喜欢的朋友可以分享一下,也算是给小编一份支持,大家都不容易啊!

【 tulaoshi.com - 编程语言 】

  

#include stdio.h
#include stdlib.h
#include string.h
#include conio.h
typedef struct
{
  unsigned int Weight;
  unsigned int Parent;
  unsigned int lChild;
  unsigned int rChild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
int LookFor(char *str,char letter,int count);
void OutputWeight(char *Data,int Length,
         char **WhatLetter,
         int **Weight,int *Count);
void HuffmanCoding(HuffmanTree *HT,
          HuffmanCode *HC,
          int *Weight,
          int Count);
void Select(HuffmanTree HT,int Count,int *s1,int *s2);
int main()
{
  HuffmanTree HT;
  HuffmanCode HC;
  char Data[100];
  char *WhatLetter;
  int *Weight;
  int Count;
  int i;
  printf("Please input the line:");
  /* Example: aaaaaaaaaaaaaabcccccc*/
  scanf("%s",Data);
  printf("n");
  OutputWeight(Data,strlen(Data),
         &WhatLetter,
         &Weight,
         &Count);
  HuffmanCoding(&HT,&HC,Weight,Count);
  printf(" Letter Weight Coden");
  for(i=0;iCount;i++)
  {
    printf(" %c ",WhatLetter[i]);
    printf("%d ",Weight[i]);
    printf("%sn",HC[i+1]);
  }
  printf("n");
  getch();
  return 0;
}
void HuffmanCoding(HuffmanTree *HT,
          HuffmanCode *HC,
          int *Weight,
          int Count)
{
  int i;
  int s1,s2;
  int TotalLength;
  HuffmanTree p;
  char* cd;
  unsigned int c;
  unsigned int f;
  int start;
  if(Count=1) return;
  TotalLength=Count*2-1;
  (*HT)=(HuffmanTree)malloc((TotalLength+1)*sizeof(HTNode));
  p=((*HT)++);
  for(i=1;i=Count;i++)
  {
    (*HT)[i].Parent=0;
    (*HT)[i].rChild=0;
    (*HT)[i].lChild=0;
    (*HT)[i].Weight=(*Weight);
    Weight++;
  }
  for(i=Count+1;i=TotalLength;i++)
  {
    (*HT)[i].Weight=0;
    (*HT)[i].Parent=0;
    (*HT)[i].lChild=0;
    (*HT)[i].rChild=0;
  }
  /*///////////////////Create HuffmanTree////////////////*/
  for(i=Count+1;i=TotalLength;++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].Weight=(*HT)[s1].Weight+(*HT)[s2].Weight;
  }
  /*///////////////////Output Huffman Code///////////////*/
  (*HC)=(HuffmanCode)malloc((Count+1)*sizeof(char*));
  cd=(char*)malloc(Count*sizeof(char));
  cd[Count-1]='';
  for(i=1;i=Count;++i)
  {
    start=Count-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((Count-start)*sizeof(char));
      strcpy((*HC)[i],&cd[start]);
    }
  }
}
void Select(HuffmanTree HT,int Count,int *s1,int *s2)
/*/(*s1) is smallest,(*s2) is smaller.*/
{
  int i;
  unsigned int temp1=0;
  unsigned int temp2=0;
  unsigned int temp3;
  for(i=1;i=Count;i++)
  {
    if(HT[i].Parent==0)
    {
      if(temp1==0)
      {
        temp1=HT[i].Weight;
        (*s1)=i;
      }
      else
      {
        if(temp2==0)
        {
          temp2=HT[i].Weight;
          (*s2)=i;
          if(temp2temp1)
          {
            temp3=temp2;
            temp2=temp1;
            temp1=temp3;
            temp3=(*s2);
            (*s2)=(*s1);
            (*s1)=temp3;
          }
        }
        else
        {
          if(HT[i].Weighttemp1)
          {
            temp2=temp1;
            temp1=HT[i].Weight;
            (*s2)=(*s1);
            (*s1)=i;
          }
          if(HT[i].Weighttemp1&&HT[i].Weighttemp2)
          {
            temp2=HT[i].Weight;
            (*s2)=i;
          }
        }
      }
    }
  }
}
int LookFor(char *str,char letter,int count)
{
  int i;
  for(i=0;icount;i++)
  {
    if(str[i]==letter) return i;
  }
  return -1;
}
void OutputWeight(char *Data,int Length,
         char **WhatLetter,
         int **Weight,int *Count)
{
  int i;
  char* Letter=(char*)malloc(Length);
  int* LetterCount=(int *)malloc(Length);
  int AllCount=0;
  int Index;
  int Sum=0;
  float Persent=0;
  for(i=0;iLength;i++)
  {
    if(i==0)
    {
      Letter[0]=Data[i];
      LetterCount[0]=1;
      AllCount++;
    }
    else
    {
      Index=LookFor(Letter,Data[i],AllCount);
      if(Index==-1)
      {
        Letter[AllCount]=Data[i];
        LetterCount[AllCount]=1;
        AllCount++;
      }
      else
      {
        LetterCount[Index]++;
      }
    }
  }
  for(i=0;iAllCount;i++)
  {
    Sum=Sum+LetterCount[i];
  }
  (*Weight)=(int*)malloc(AllCount);
  (*WhatLetter)=(char*)malloc(AllCount);
  for(i=0;iAllCount;i++)
  {
    Persent=(float)LetterCount[i]/(float)Sum;
    (*Weight)[i]=(int)(1000*Persent);
    (*WhatLetter)[i]=Letter[i];
  }
  (*Count)=AllCount;
}

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1614954.html

延伸阅读
标签: ASP
数据库结构(共使用了两个表) 1.tblCategory 字段名 类型 Root binary 说明树关或开(目录的根) ID 自动编号 关键字 Sort integer 识别该字段内容的整数(如果root是开状态sort为0)表示显示的目录的顺序 Name text(255)可以包含html中的标识符 HREF text(255) 允许空 2.tblPages ID 自动编号 Sort integer 关键字 Name text...
一、编码规则 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就...
标签: ASP
  纯编码实现Access数据库的建立或压缩!! <% '#######以下是一个类文件,下面的注解是调用类的方法################################################ '#  注意:如果系统不支持建立Scripting.FileSystemObject对象,那么数据库压缩功能将无法使用 '#          &nbs...
标签: ASP
  bigeagle】 于 2000-12-6 14:43:38 加贴在 Joy ASP ↑: 下面这种方法是大怪兽和怡红公子现在采用的方法 create table forum ( ID int NOT NULL IDENTITY,/*帖子序列号*/ rootID int NOT NULL, /*根帖子序列号*/ parentID int NOT NULL default=0,/*双亲帖子序列号*/ indent tinyint,/*缩进*/ order tinyint,/*同主题帖子排序*/ user...
标签: Web开发
function JsUBB(str)   {   var re=//[i/](.[^/[]*)/[//i/]/gi;   str=str.replace(re,"i$1/i"); //斜体字   re=//[b/](.[^/[]*)/[//b/]/gi;   str=str.replace(re,"b$1/b"); //粗体字   re=//[u/](.[^/[]*)/[//u/]/gi;   str=str.replace(...

经验教程

619

收藏

54
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部