头文件Huffman.h
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define OK 1
#define ERROR 0
char cdd[10][10];
typedef struct
{
int weight; //权值
int parent, lchild, rchild;
}HTNode, * HuffmanTree;
typedef struct
{
int *w;
char *code;
}CD;
void Select(HuffmanTree HT,int b,int *s1,int *s2)
{
int i,j,k=0,a[20],temp;
for(i=1;i<=b;i++)
if(HT[i].parent==0)
{
a[k]=HT[i].weight;
k++;
}
for(i=0;i<k-1;i++)
for(j=0;j<k-i-1;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
for(i=1;i<=b;i++)
{
if(a[0]==HT[i].weight)
*s1=i;
if(a[1]==HT[i].weight)
*s2=i;
}
}
/*void Select(HuffmanTree HT,int a,int *s1,int *s2){
int i;
*s1=*s2=HT[1].weight;
for(i=1;i<a;i++)
{
if(HT[i].weight<(*s1)&&HT[i].parent==0)
*s1=HT[i].weight;
}
for(i=1;i<a;i++)
{ if(HT[i].weight==(*s1))
continue;
if(HT[i].weight<(*s2)&&HT[i].parent==0)
*s2=HT[i].weight;
}
}*/
void clear(char *a)
{
int len,i;
len=strlen(a);
for(i=0;i<len;i++)
a[i]='\0';
}
void HuffmanCoding(HuffmanTree HT, int * w, int n)
{
int m; //
HuffmanTree p;
int i,s1,s2;
char cd[20];//cdd[10][20];
int start, c, f;
int flag=0;
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=n;i<=m;++i,++p) //n<=i<=m
{
p->weight=0;
p->parent=0;
p->lchild=0;
p->rchild=0;
}
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;
}
printf ("\n");
printf (" no\tweight\tparent\tlchild\trchild\n");
for(i=1;i<=m;++i)
printf(" %d\t %d\t %d\t %d\t %d\n",i, HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
cd[n-1]='\0'; //
for(i=1;i<=n;++i,w++)
{
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';
}
strcpy(cdd[i-1],&cd[start]);
clear(cd);
}
for(i=0;i<4;++i)
printf("%s\t\n",cdd[i]);
return ;
}
void bianma(char *aa,CD cd)
{
int i,j,length1,length2;
char bb[100]={'\0'};
length1=strlen(aa);
length2=strlen(cd.code);
for(i=0;i<length1;i++)
{
for(j=0;j<length2;j++)
if(aa[i]==cd.code[j])
strcat(bb,cdd[j]);
}
printf("\n%s\n",bb);
}
void jiema(char *a,CD cd){
int len1,len2,i,j=0,k,m=0,flag=0;
char b[20]={'\0'},h[10]={'\0'};
len1=strlen(a);
len2=strlen(cd.code);
for(i=0;i<len1;i++)
{
b[j]=a[i];
for(k=0;k<len2;k++)
if(strcmp(b,cdd[k])==0)
{
h[m]=cd.code[k];
m++;
clear(b);
flag=1;
}
j++;
if(flag==1)
{
j=0;
flag=0;
}
}
printf("\n%s\n",h);
}
c文件 Huffman.c
#include "Huffman.h"
int main(void)
{
HTNode HT;
CD cd;
int * w, n, i;
char aa[20],bb[20];
printf("请输入结点数:");
scanf("%d",&n);
cd.w=(int *)malloc(n*sizeof(int));
cd.code=(char *)malloc(n*sizeof(char));
printf("请依次输入权值和字符:\n",n);
for(i=0;i<=n-1;i++)
scanf("%d %c",cd.w+i,cd.code+i);
HuffmanCoding(&HT,cd.w,n);
printf("编码:\n");
scanf("%s",aa);
bianma(aa,cd);
printf("解码:\n");
scanf("%s",bb);
jiema(bb,cd);
return 0;
}