【C语言】数据结构与算法哈夫曼树

当年数据结构与算法的实验报告,难了我好几天

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
    int weight;
    int parent;
    int Lchild;
    int Rchild;
}HTNode,*HuffmanTree;
void select(HuffmanTree *ht,int n,int *s1,int *s2)
{
    int i,min1=100,min2=100;
    for(i=1,*s1=0,*s2=0;i<=n;i++)
    {
        if((*ht)[i].parent==0)
        {
            if((*ht)[i].weight<=min1)
            {
                min2=min1;
                min1=(*ht)[i].weight;
                *s2=*s1;
                *s1=i;
            }
            else if((*ht)[i].weight<min2)
            {
                *s2=i;
                min2=(*ht)[i].weight;
            }
        }
    }
}
void CrtHuffmanTree(HuffmanTree *ht,char ***hc,int *w,int n)
{
    int m,i,s1,s2,start,c,p;char *cd;
    m=2*n-1;
    *ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
    for(i=1;i<=n;i++)(*ht)[i]=(HTNode){w[i],0,0,0};
    for(i=n+1;i<=m;i++)(*ht)[i]=(HTNode){0,0,0,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;
    }
    (*hc)=(char**)malloc((n+1)*sizeof(char*));
    cd=(char*)malloc(n*sizeof(char));
    cd[n-1]='\0';
    for(i=1;i<=n;i++)
    {
        start=n-1;
        for(c=i,p=(*ht)[i].parent;p!=0;c=p,p=(*ht)[p].parent)
        {
            if((*ht)[p].Lchild==c)cd[--start]='0';//左分支标0
            else cd[--start]='1';//右分支标1
        }
        (*hc)[i]=(char*)malloc((n-start)*sizeof(char));
        strcpy((*hc)[i],&cd[start]);
    }
    free(cd);
}
int main()
{
    HuffmanTree *ht;char **hc;int a,i;
    int w[10];
    printf("请输入叶子节点个数:");
    scanf("%d",&a);
    for(i=1;i<=a;i++)
    {
        printf("请输入第%d个叶子结点的值:",i);
        scanf("%d",&w[i]);
    }
    CrtHuffmanTree(ht,&hc,w,a);
    for(i=1;i<=a;i++)
    {
        printf("第%d个叶子节点的哈夫曼编码为:",i);
        puts(hc[i]);
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值