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

📄 赫夫曼编码器.cpp

📁 按照清华大学的教材
💻 CPP
字号:
# include <stdio.h>
# include <malloc.h>
# include <iostream.h>
# include <conio.h>
# include <string.h>

# define MAX_LENGTH 100
typedef char **HuffmanCode;

typedef struct		
{   int weight;
	int mark;
    int parent,lchild,rchild;
}HTNode,*HuffmanTree;
//选择权值最小的两个结点元素
void Select(HuffmanTree HT,int i,int &s1,int &s2)  
{  int j,k=1;                
   while(HT[k].parent!=0)
       k++;
   s1=k;
   for(j=1;j<=i;++j)
      if(HT[j].parent==0&&HT[j].weight<HT[s1].weight)
	  s1=j;
   k=1;
   while((HT[k].parent!=0||k==s1))
      k++;
   s2=k;
   for(j=1;j<=i;++j)
      if(HT[j].parent==0&&HT[j].weight<HT[s2].weight&&j!=s1)
	  s2=j;
} 
//编码
void HuffmanCoding(HuffmanTree &HT,HuffmanCode&HC,int *w,int n) 
{  int m,i,s1,s2,start,c,f;
   HuffmanTree p;
   if(n<=1)
	return;
   m=2*n-1;
   HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
   for(p=HT+1,i=1;i<=n;++i,++p,++w)	
     {  
	    p->weight=*w;
		p->parent=0;
		p->lchild=0;
		p->rchild=0;
     }
   for(;i<=m;++i,++p)			
     {  
	    p->weight=0;
		p->parent=0;
		p->lchild=0;
		p->rchild=0;
     }
   cout<<endl<<endl<<"Huffman树创建过程如下:";
   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].weight=HT[s1].weight+HT[s2].weight;
      cout<<endl<<"HT["<<s1<<"] 和 HT["<<s2<<"] 创建";
      cout<<" HT["<<i<<"], 权值="<<HT[i].weight;
   }
   HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
   char *cd;
   cd=(char *)malloc(n*sizeof(char));
   cd[n-1]='\0';
   cout<<endl<<endl<<"Huffman树编码如下:"<<endl;
   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("\nHT[%d]结点元素的编码: %s",i,HC[i]);
   }
   free(cd);
} 
void main()            		
{  
   HuffmanTree HT;
   HuffmanCode HC;
   int n,i;
   int *w,W[MAX_LENGTH];;
   cout<<endl<<endl<<"HuffmanCoding.cpp";
   cout<<endl<<"================="<<endl;
   cout<<endl<<"请输入进行编码元素的个数: ";
   cin>>n;
   for(i=0;i<n;++i)
   {  
	   cout<<"请输入第"<<i+1<<"元素的权值: ";
      cin>>W[i];
   }
   w=W;
   HuffmanCoding(HT,HC,w,n);
   cout<<endl;

} 

⌨️ 快捷键说明

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