完整赫夫曼编码 C语言版

头文件Huffman.h

#include<stdio.h>

#include<malloc.h>

#include<string.h>

 

#define OK 1

#define ERROR 0

char cdd[10][10];

typedef struct

{

     int weight; //权值

     int parent, lchild, rchild;

}HTNode, * HuffmanTree;

typedef struct
{
int *w;
char *code;
}CD;

 

void Select(HuffmanTree HT,int b,int *s1,int *s2)

{

    int i,j,k=0,a[20],temp;

    for(i=1;i<=b;i++)

    if(HT[i].parent==0)

    {

    a[k]=HT[i].weight;

    k++;

 

    }

    for(i=0;i<k-1;i++)

    for(j=0;j<k-i-1;j++)

    {

        if(a[j]>a[j+1])

        {

            temp=a[j];

            a[j]=a[j+1];

            a[j+1]=temp;

        }

    }

    for(i=1;i<=b;i++)

    {

        if(a[0]==HT[i].weight)

            *s1=i;

        if(a[1]==HT[i].weight)

            *s2=i;

    }

 

}

 

/*void Select(HuffmanTree HT,int a,int *s1,int *s2){
int i;
*s1=*s2=HT[1].weight;
for(i=1;i<a;i++)
{
    if(HT[i].weight<(*s1)&&HT[i].parent==0)
        *s1=HT[i].weight;
}

for(i=1;i<a;i++)
{   if(HT[i].weight==(*s1))
        continue;
    if(HT[i].weight<(*s2)&&HT[i].parent==0)
        *s2=HT[i].weight;
}

}*/


void clear(char *a)
{
int len,i;
len=strlen(a);
for(i=0;i<len;i++)
    a[i]='\0';
}

 

void HuffmanCoding(HuffmanTree HT,  int * w, int n)

{

    int m; //

    HuffmanTree p;

    int i,s1,s2;

    char cd[20];//cdd[10][20];

    int start, c, f;

    int flag=0;

   

    if(n<=1)

        return ;

    m=2*n-1;

    HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //

 

    for(p=HT+1,i=1;i<=n;++i,++p,++w)

    {

        p->weight=* w;

        p->parent=0;

        p->lchild=0;

        p->rchild=0;

    }

    for(i=n;i<=m;++i,++p) //n<=i<=m

    {

        p->weight=0;

        p->parent=0;

        p->lchild=0;

        p->rchild=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;

 

   

    }
    
    printf ("\n");
    printf ("  no\tweight\tparent\tlchild\trchild\n");

    for(i=1;i<=m;++i)

    printf("   %d\t   %d\t   %d\t   %d\t   %d\n",i, HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);

   

    cd[n-1]='\0'; //

    for(i=1;i<=n;++i,w++)

    {

        start=n-1; //

        for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)

        {

       

            if(HT[f].lchild==c)

                cd[--start]='0';

               

            else

                cd[--start]='1';

   

        }

        strcpy(cdd[i-1],&cd[start]);

        clear(cd);

    }
    for(i=0;i<4;++i)
        printf("%s\t\n",cdd[i]);
   

    return ;

}

void bianma(char *aa,CD cd)
{
int i,j,length1,length2;
char bb[100]={'\0'};
length1=strlen(aa);
length2=strlen(cd.code);

for(i=0;i<length1;i++)
{
for(j=0;j<length2;j++)
    if(aa[i]==cd.code[j])
    strcat(bb,cdd[j]);
    
}
printf("\n%s\n",bb);

}


void jiema(char *a,CD cd){

int len1,len2,i,j=0,k,m=0,flag=0;
char b[20]={'\0'},h[10]={'\0'};
len1=strlen(a);
len2=strlen(cd.code);
for(i=0;i<len1;i++)
{
    b[j]=a[i];
for(k=0;k<len2;k++)
    if(strcmp(b,cdd[k])==0)
    {
        h[m]=cd.code[k];
        m++;
        clear(b);
        flag=1;
    }
j++;
if(flag==1)
{
j=0;
flag=0;
}

}

printf("\n%s\n",h);

}


 

c文件 Huffman.c

 

#include "Huffman.h"

 

int main(void)

{

    HTNode HT;
    CD cd;

    int * w, n, i;
    char aa[20],bb[20];

    printf("请输入结点数:");

    scanf("%d",&n);

    cd.w=(int *)malloc(n*sizeof(int));

    cd.code=(char *)malloc(n*sizeof(char));

    printf("请依次输入权值和字符:\n",n);

    for(i=0;i<=n-1;i++)

        scanf("%d %c",cd.w+i,cd.code+i);

    HuffmanCoding(&HT,cd.w,n);
    printf("编码:\n");
    scanf("%s",aa);
    bianma(aa,cd);
    printf("解码:\n");
    scanf("%s",bb);
    jiema(bb,cd);

    return 0;

}


  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值