Huffman编码问题

#include        
#include
#include
#define n 100
#define m 2*n-1
typedef struct {
	char ch;
	char bits[9];
	int len;
}CodeNode;
typedef CodeNode HuffmanCode[n+1];
typedef struct {
	int weight;               //权值
	int lchild,rchild,parent; //左右孩子及双亲指针
}HTNode;
typedef HTNode HuffmanTree[m+1];//0号单元不可用
int num;

void select(HuffmanTree T,int k,int &s1,int &s2)
{//在HT[1..k]中选择parent为0且权值最小的两个根结点,
	//其序号分别为s1和s2
	int i,j;int min1=101;
	for(i=1;i<=k;i++)
		if(T[i].weight='A' && *p<='z'){
			k=*p-64;
			temp[k]++;
		}
	}
	j=0;
	for(i=1,j=0;i<=26;i++)  //统计有多少种字符
		if(temp[i]!=0){
			j++;
			str[j]=i+64;  //送对应字母到数组中
			cnt[j]=temp[i];//存入对应字母的权值
		}
		return j;
}
void ChuffmanTree(HuffmanTree HT,HuffmanCode HC,int cnt[],char str[])
{//构造赫夫曼树HT
	int i,s1,s2;
	for(i=1;i<=2*num-1;i++)  //初始化HT
	{ HT[i].lchild=0;HT[i].rchild=0;
      HT[i].parent=0;HT[i].weight=0;
	}
	for(i=1;i<=num;i++)   //输入num个叶结点的权值
		HT[i].weight=cnt[i];
	for(i=num+1;i<=2*num-1;i++)
	{  //在HT[1..-1]中选择parent为0且权值最小的两个根结点,
		//其序号分别为s1和s2);
		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;
	}
	for(i=0;i<=num;i++)   //输入字符集中的字符
		HC[i].ch=str[i];
	i=1;while(i<=num)
		printf("字符%c,次数为:%d\n",HC[i].ch,cnt[i++]);
}
	void HuffmanEncoding(HuffmanTree HT, HuffmanCode HC)
	{//根据赫夫曼树HT求赫夫曼树编码HC
		int c,p,i;  //c和p分别指示T中孩子和双亲的位置
		char cd[n];  //临时存放编码串
		int start;   //指示编码在cd中起始位置
		cd[num]='\0';  //最后一位放上串结束符
		for(i=1;i<=num;i++)
		{
			start=num;		//初始位置
			c=i;
			while((p=HT[c].parent)>0)   //直至上溯到HT[c]及树根为止
			{//若T[c]是T[p]的左孩子,则生成代码1
				cd[--start]=(HT[p].lchild==c)?'0':'1';
				c=p;
			}//end or while
			strcpy(HC[i].bits,&cd[start]);
			HC[i].len=num-start;
		}//end or for
	}

	void coding(HuffmanCode HC,char *str)
	{//对str所代表的字符串进行编码,并写入文件
		int i,j;
		FILE *fp;
		fp=fopen("codefile.txt","w");
		while(*str){
			for(i=1;i<=num;i++)
				if(HC[i].ch==*str){
					for(j=0;j

你可能感兴趣的:(Huffman编码问题)