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

📄 哈夫曼编码.cpp

📁 根据信源压缩编码——Huffman编码的原理
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MaxValue 10
#define MaxBit 10
#define MaxN 10

#include"Haffman.h"

typedef struct
{
  char zimu;
  int  cishu;
  float pinlv;
}xinyuan;




void pinlvtongji(char wenben[],xinyuan x[],int *m)             //英文文本频率统计
{
  int i,p,j,k;

  int flag;
 
  k=0;
  p=strlen(wenben);
  

  x[0].zimu=wenben[0];
  x[0].cishu=1;
 

  k++;


  for(i=1;i<p;i++)
  {
  	    flag=0;

		for(j=0;j<k;j++)
		{
			if(x[j].zimu==wenben[i])
			{
			  x[j].cishu++;
			  flag=1;
			  break;
			}
        }
		if(flag==0)
		{
			x[k].zimu=wenben[i];
            x[k].cishu=1;
            k++;
		}
		
  }     

  for(i=0;i<k;i++)
	  x[i].pinlv=(float)x[i].cishu/p;

  printf("输出英文文本统计后的各种字母:");
  printf("\n");

  for(i=0;i<k;i++)
	 printf("%c        ",x[i].zimu);
  
  printf("\n");
  printf("\n");

  printf(" 输出各种字母对应的出现次数:");
  printf("\n");
  for(i=0;i<k;i++)
	 printf("%d        ",x[i].cishu);
  
  printf("\n");
  printf("\n");

  printf("输出各种字母出现的频率:");
  printf("\n");
  for(i=0;i<k;i++)
	  printf("%f ",x[i].pinlv);  

   printf("\n");
   printf("\n");
  *m=k  ;	  
}



void main(void)
{
  int i,j,k,n;
  int m;
  char english[100];
  xinyuan  aaa[24];
  int weight[24];

  printf("请输入英文文本:");
  printf("\n");
  scanf("%s",english);
  n=strlen(english);
  printf("\n");

  pinlvtongji(english,aaa,&m);
  
  

  for(i=0;i<m;i++)
	  weight[i]=aaa[i].cishu;

  
  HaffNode *myHaffTree=(HaffNode *)malloc(sizeof(HaffNode)*(2*m+1));
  Code *myHaffCode =(Code *)malloc(sizeof(Code)*m);


  Haffman(weight,m,myHaffTree);
  HaffmanCode(myHaffTree,m,myHaffCode);


  printf("输出各种英文字母对应的哈夫曼编码:");
  printf("\n");
  /*输出每个叶节点饿哈夫曼编码*/
  for(i=0;i<m;i++)
  {
    /* printf("weight =%d   Code=",myHaffCode[i].weight); */

	 for(j=myHaffCode[i].start;j<m;j++)
	     printf("%d",myHaffCode[i].bit[j]);
	 printf("        ");
  }
  printf("\n");
  printf("\n");
 
  printf("输出英文文本对应的哈夫曼编码:");
  /*英文压缩,即输出英文文本对应的编码*/
  for(k=0;k<n;k++)
  {
    for(i=0;i<m;i++)
	{
		if(aaa[i].zimu==english[k])
		{
         for(j=myHaffCode[i].start;j<m;j++)
	     printf("%d",myHaffCode[i].bit[j]);
         printf(" ");
	     
		}
		
		
	}

  }
  printf("\n");

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -