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

📄 huffman.cpp

📁 哈夫曼树的实现.
💻 CPP
字号:

#include"Huffman.h"

//此函数用于选取最小权值的下标分别放在min1和min2
static void SelectTwoMin(HuffmanTree HT,int n,int &min1,int &min2){
	int i=1;
	int tmp;
	int m1,m2;
	for(;i<=n;i++)
	{
		if(HT[i].parent !=0) continue;
		else
		{
			m1=i;
			break;
		}	
	}
	i++;
	for(;i<=n;i++)
	{
		if(HT[i].parent !=0) continue;
		else
		{
			(HT[i].weight>=HT[m1].weight)?(m2=i):(m2=m1,m1=i);
			break;
		}
	}
	i++;
	for(;i<=n;i++)
		if(HT[i].parent !=0) continue;
		else
		{
			tmp=m1;
			m1=((HT[m1].weight <HT[i].weight)?m1:i) ;
			m2=((m1==tmp)?((HT[m2].weight <=HT[i].weight)?m2:i):tmp);
			//((HT[m2].weight <HT[tmp].weight)?min2:tmp);
		}	
min1=m1,min2=m2;

	}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){
	int i,f,m,start,min1,min2,*pi;
	unsigned c;
	char* cd;
	pi=w;
	if(n<=1)return ;
	m=2*n-1;
	HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
	for(i=1;i<=n;++i,++pi)
	{
		HT[i].weight=*pi;
		HT[i].parent=HT[i].lchild=HT[i].rchild=0;
	}
	for(;i<=m;++i)
	{
		HT[i].weight=0;
		HT[i].parent=HT[i].lchild=HT[i].rchild=0;
	}
	for(i=n+1;i<=m;++i)
	{
		SelectTwoMin(HT,i-1,min1,min2);
		HT[min1].parent=i;	HT[min2].parent=i;
		HT[i].lchild=min1;	HT[i].rchild=min2;
		HT[i].weight =HT[min1].weight+HT[min2].weight;
	}
	HC=(HuffmanCode)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]);
	}
	free(cd);
	
	}


⌨️ 快捷键说明

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