HuffmanCode---数组实现

#include <stdio.h>
#inlucde <stlib.h>

//定义结构体数组类型

typedef struct
{
   char word;//字符域;
   int weight;//字符对应的权值域;
   int left,right,parent;//分别是左子女,右子女,双亲结点域;
   int * code;//编码域;
}HuffNode;

//CreateHuffmanTree

oid CreateHuffmanTree(HuffNode * F,int n)
{
    int loop;
    int k1,k2;
    int i;
    for(loop=0;loop<n-1;loop++)
    {
        for(k1=0;k1<n+loop&&F[k1].parent!=-1;k1++);//找第一个还未挂上去的结点;
        for(k2=k1+1;k2<n+loop&&F[k2].parent!=-1;k2++);//找第二个还未挂上去的结点;
        //for循环,出来k1指weight最小,k2指weight次小;
        for(i=k2;i<n+loop;i++)
        {
            if(F[i].parent==-1)
            {
                if(F[i].weight<F[k1].weight)
                {
                    k2=k1;
                    k1=i;
                }
                else if(F[i].weight<F[k2].weight)
                k2=i;
            }
        }
        //初始化新生成的双亲结点;
        F[i].word='x';
        F[i].weight=F[k1].weight+F[k2].weight;
        F[i].left=k1;
        F[i].right=k2;
        F[i].parent=-1;
        //初始化k1,k2的双亲域;
        F[k1].parent=F[k2].parent=i;
    }
}

//CreateHuffmanCode

void CreateHuffmanCode(HuffNode * F,int n)
{
    int c,pa,i;
    int * p;
    for(i=0;i<n;i++)
    {
        F[i].code=p=(int *)malloc(n*sizeof(int));//初始化code域;
        p[0]=0;//p[0]作编码数组的岗哨,永远指向最后一位码,因此初始化0;
        c=i;//c表示当前结点下标;
        while(F[c].parent!=-1)//循环终止条件:当前结点为根结点;
        {
            pa=F[c].parent;
            //左子女赋0,右子女赋1;
            if(F[pa].left==c)
            p[++p[0]]=0;
            else
            p[++p[0]]=1;
            c=pa;
        }
    }
 }

//PrintHuffmanCode

void PrintHuffmanCode(HuffNode * F,int n)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        printf("%s",F[i].word);
        printf("-----");
        for(j=F[i].code[0];j>0;j--)
        printf("%d",F[i].code[j]);
        printf("\n");
    }
 } 

//main函数体

int main(void)
{
    HuffNode * F;
    int n,w,i;
    char ch;
    printf("请输入叶子结点个数n:");
    scanf("%d",&n);
    //创建森林
    F=(HuffNode *)malloc((2*n+1)*sizeof(HuffNode));
    for(i=0;i<n;i++)
    {
        printf("请输入word的值:");
        scanf("%s",&ch);
        F[i].word=ch;
        printf("请输入weight的值:");
        scanf("%d",&w);
        F[i].weight=w;
        F[i].left=F[i].right=F[i].parent=-1;
    }
    //创建HuffmanTree
    CreateHuffmanTree(F,n); 
    //创建HuffmanCode
    CreateHuffmanCode(F,n);
    //输出
    PrintHuffmanCode(F,n); 
    return 0;
}

希望能帮到大家!
我的希望是:世界和平!
嘻嘻!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值