Huffmantree代码

#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
typedef  struct 
{
    int weight;
    int parent;
    int lchild;
    int rchild;
}HTNode,*HuffmanTree;

static char N[100];

typedef char **HuffmanCode;


typedef  struct 
{
    int s1;
    int s2;
}MinCode;
void Error(char *message);
HuffmanCode HuffmanCoding(HuffmanTree &HT,HuffmanCode HC,int *w,int n);
MinCode   Select(HuffmanTree HT,int n);


void Error(char *message)
{  
    fprintf(stderr,"Error:%s\n",message);  
    exit(1);
}


HuffmanCode HuffmanCoding(HuffmanTree &HT,HuffmanCode HC,int *w,int n)

    int i,s1=0,s2=0; 
    HuffmanTree p;
    char *cd;
    int f,c,start,m;
    MinCode min;

    if(n<=1) 
    {
      //  Error("Code too small!");
    }

    m=2*n-1;
    HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));

 
    for(p=HT,i=0;i<=n;i++,p++,w++)
    { 
        p->weight=*w;  
        p->parent=0; 
        p->lchild=0; 
        p->rchild=0;
    }

   
    for(;i<=m;i++,p++)
    { 
        p->weight=0;  
        p->parent=0; 
        p->lchild=0;
        p->rchild=0;
    }

  
    for(i=n+1;i<=m;i++)
    {
        min=Select(HT,i-1);
        s1=min.s1 ;
        s2=min.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("HT  List:\n");
    printf("Number\t\tweight\t\tparent\t\tlchild\t\trchild\n");

    for(i=1;i<=m;i++)
    {
        printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\t\n",i,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
    }


    HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
    cd=(char *)malloc(n*sizeof(char *));
    cd[n-1]='\0';cd[3-1] = '\0';

   
    for(i=1;i<=n;i++)
    { 
        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';
        }


        HC[i]=(char *)malloc((n-start)*sizeof(char *));
  
        strcpy(HC[i],&cd[start]);   
    }
    free(cd);
    return HC;
}

MinCode Select(HuffmanTree HT,int n)
{  
    int min,secmin;
    int temp = 0;
    int i,s1,s2,tempi = 0;
    MinCode  code ;
    s1=1;
    s2=1;

    min = 66666;

   
    for(i=1;i<=n;i++)
    {
        if(HT[i].weight<min && HT[i].parent==0)
        {
            min=HT[i].weight;
            s1=i;
        }
    }

    secmin = 66666;

 
    for(i=1;i<=n;i++)
    {
        if((HT[i].weight<secmin) && (i!=s1) && HT[i].parent==0)
        {
            secmin=HT[i].weight; 
            s2=i;
        }
    }


    code.s1=s1;
    code.s2=s2;
    return code;
}

void HuffmanTranslateCoding(HuffmanTree HT, int n,char* ch)
{
    int m=2*n-1;
    int i,j=0;

    printf("After Translation:");
    while(ch[j]!='\0')
    {
        i=m;
        while(0 != HT[i].lchild && 0 != HT[i].rchild)
        {
            if('0' == ch[j])
            {
                i=HT[i].lchild;
            }
            else
            {
                i=HT[i].rchild;
            }
            ++j;
        }
        cout<<N[i-1];
    
    }
    cout<<endl;
}

void show()
{
    cout<<"******************************************************************************"<<endl;
    cout<<"*************  1.输入Huffmantree的参数                       *****************"<<endl;
    cout<<"*************  2.初始化Huffmantree的参数.<含有26字母及空格>  ****************"<<endl;
    cout<<"*************  3.创建Huffmantree和编码表                     *****************"<<endl;
    cout<<"*************  4.输出编码表                                  *****************"<<endl;
    cout<<"*************  5.输入编码,并翻译为字符                      *****************"<<endl;
    cout<<"*************  6.输入字符,并实现转码                        *****************"<<endl;
    cout<<"*************  7.退出                                        *****************"<<endl;
    cout<<"******************************************************************************"<<endl;
}
int main()
{
    show();
    int o;
    HuffmanTree HT=NULL;
    HuffmanCode HC=NULL;
    int *w=NULL;
    int i,n;
    char tran[100];

    
    while(1)
    {
        cout<<"请输入你要进行的操作"<<endl;
        cin>>o;
        if(o==1)
        {
            getchar() ;
            printf("Input  N(char):");
            gets(N);
            fflush(stdin);//fflush(stdin)是一个计算机专业术语,功能是清空输入缓冲区,通常是为了确保不影响后面的数据读取
        //    (例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行fflush(stdin);)。
            n = strlen(N);
        
            w=(int *)malloc((n+1)*sizeof(int *));
            w[0]=0;
            printf("Enter weight:\n");
             
            for(i=1;i<=n;i++)
            {  
                printf("w[%d]=",i);  
                scanf("%d",&w[i]);
            }
            fflush(stdin);
        }
        if(o==2) 
        {
            
        }
        if(o==3)
        {
          
                HC=HuffmanCoding(HT,HC,w,n);
        }
        if(o==4)
        {
            
            printf("HuffmanCode:\n");
            printf("Number\t\tWeight\t\tCode\n");
            for(i=1;i<=n;i++)
            {
                printf("%c\t\t%d\t\t%s\n",N[i-1],w[i],HC[i]);
            }
        
            fflush(stdin);
        }
        if(o==5)
        {
            getchar();
          
            printf("Input HuffmanTranslateCoding:");
            gets(tran);
            HuffmanTranslateCoding(HT, n, tran);
        }
    }
}

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

小皓同学

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值