哈夫曼编码

/*
功能:(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;
    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值