哈夫曼编码

来源:互联网 发布:json解析哪些框架 编辑:程序博客网 时间:2024/06/06 09:11
/*功能:(1)构建哈夫曼树     (2)获取哈夫曼编码     (3)计算带权路径长度作者:pussy日期:2015-11-29*/# include<stdio.h># include<stdlib.h># define MAX 100# define INF 65535typedef 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;    }}

这里写图片描述

0 0
原创粉丝点击