您的位置:首页 > 其它

哈夫曼编码

2015-11-29 21:41 429 查看
/*
功能:(1)构建哈夫曼树
(2)获取哈夫曼编码
(3)计算带权路径长度
作者:pussy
日期:2015-11-29
*/

# include<stdio.h>
# include<stdlib.h>
# define MAX 100
# define INF 65535

typedef struct BiNode{
char data[MAX];
int weight;
int parent,lchild,rchild;
}BiNode;

typedef struct{
int data[MAX];
int start;
}HuffCode;

void createHuffman(BiNode huffman[],int n);
void HuffmanCode(BiNode huffman[],int n,HuffCode huffcode[]);

int main()
{
int n,i,j,wpl=0;
printf("请输入节点的个数:\n");
scanf("%d",&n);
BiNode * huffman=(BiNode *)malloc(2*n*sizeof(BiNode));
HuffCode *huffcode=(HuffCode *)malloc((n+1)*sizeof(HuffCode));
printf("请输入节点内容以及权值(格式:内容 权值)\n");
for(i=1;i<=n;i++)
{
scanf("%1s%d",&huffman[i].data,&huffman[i].weight);

huffman[i].lchild=huffman[i].parent=huffman[i].rchild=-1;
}
for(i=n+1;i<2*n;i++)
{
huffman[i].lchild=huffman[i].parent=huffman[i].rchild=-1;
}
createHuffman(huffman,n);
HuffmanCode(huffman,n,huffcode);
printf("输出各个点的哈夫曼编码\n");
for(i=1;i<=n;i++)
{
printf("%1s的哈夫曼编码为:",huffman[i].data);
for(j=huffcode[i].start;j<=n;j++)
{
printf("%d",huffcode[i].data[j]);
}
wpl=wpl+huffman[i].weight*(n-huffcode[i].start+1);
printf("\n");
}
printf("哈夫曼树的平均路径长度为%d\n",wpl);
return 0;
}

void createHuffman(BiNode huffman[],int n)
{
int i,j;
int min1,min2,lchild,rchild;
for(i=n+1;i<=2*n-1;i++)
{
min1=min2=0;
huffman[min1].weight=huffman[min2].weight=INF;
for(j=1;j<i;j++)
{
if(huffman[j].parent==-1)
{
//min1记录权值最小的节点的下标
//min2记录权值第二小的节点的下标
if(huffman[j].weight<huffman[min1].weight)
{
min2=min1;
min1=j;
}
else if(huffman[j].weight<huffman[min2].weight)
{
min2=j;
}
}
}
huffman[min1].parent=i;
huffman[min2].parent=i;
huffman[i].lchild=min1;
huffman[i].rchild=min2;
huffman[i].weight=huffman[min1].weight+huffman[min2].weight;
}
}

void HuffmanCode(BiNode huffman[],int n,HuffCode huffcode[])
{
int i,j;
for(i=1;i<=n;i++)
{
int start=n;
int f=i;
int p=huffman[i].parent;
//huffcode[i].data=(int *)malloc(sizeof(int)*(n+1));
while(p!=-1)
{
if(f==huffman[p].lchild)
huffcode[i].data[start--]=0;
else if(f==huffman[p].rchild)
huffcode[i].data[start--]=1;
f=p;
p=huffman[p].parent;
}
huffcode[i].start=start+1;
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: