哈夫曼树的创建以及编码

原创 2015年11月17日 21:22:54

在codeblocks下编译运行通过。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
    int weight;
    int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;


int min1(HuffmanTree t,int i)
{//函数VOID select调用
   int j,flag;
   int k=10000;//取K为最小可能的值
   for(j=1;j<=i;j++)
     if(t[j].weight<k && t[j].parent==0)
        {
           k=t[j].weight;
           flag=j;
        }
        t[flag].parent=1;
        return flag;
}

void Select(HuffmanTree HT,int i,int *s1,int *s2)
{
   int j;
   *s1=min1(HT,i);
   *s2=min1(HT,i);
   if(*s1>*s2)
   {
       j=*s1;
      *s1=*s2;
      *s2=j;
   }
}

//创建哈夫曼树
void CreateHuffmanTree(HuffmanTree *HT,int *w,int n){
    int i,s1,s2,k,f;
    if(n<=1) printf("error");
    int m;
    m=2*n-1;
    HTNode *p;
    *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<=m;i++,p++){
        p->weight=0;
        p->parent=0;
        p->lchild=0;
        p->rchild=0;
    }

    //在HT[1...i-1]中选择parent为0且权值最小的两个节点,序号分别为s1,s2;
    for(i=n+1;i<=m;i++){
    printf("1111111");
        Select(*HT,i-1,&s1,&s2);
    printf("222222");
        HT[s1]->parent = i;  printf("333333");HT[s2]->parent = i;
        HT[i]->lchild = s1;   HT[i]->rchild = s2;
        HT[i]->weight = HT[s1]->weight + HT[s2]->weight;
    }
}

//得到Huffman编码
void HuffmanTreeCode(HuffmanTree *HT,HuffmanCode *HC,int n){
   int start,c,i,f;
   char *cd;
   *HC=(HuffmanCode)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,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);
   //打印哈夫曼编码
   printf("number\t\tweight\t\tCode\n");
   for(i=1;i<=n;i++){
    printf("%d\t\t%d\t\t%d\n",i,HT[i]->weight,HC[i]);
   }
}

void ShowHuffmanTree(HuffmanTree HT,int n){
    int i;
    printf("赫夫曼树如下:\n");
    printf("number\t\tweight\t\tparent\t\tlchild\t\trchild\n");
    for(i=1;i<=2*n-1;i++){
        printf("%d\t\t%d\t\t%d\t\t%d\t\t%d\n",i,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
    }
}

void main(){
    int i,n;
    int *w;
    printf("请输入节点个数n(n>1):");
    scanf("%d",&n);
    w=(int *)malloc((n+1)*sizeof(int));
    w[0]=0;
    printf("请输入对应的权值:");
    for(i=1;i<=n;i++){
        scanf("%d",&w[i]);
    }
    HuffmanCode HC=NULL;
    HuffmanTree HT=NULL;
    CreateHuffmanTree(&HT,w,n);
    HuffmanTreeCode(&HT,&HC,n);
    ShowHuffmanTree(HT,n);
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

phpmyadmin创建数据库设置默认编码

php做项目的时候要用到数据库。创建数据库,难免就会输入中文字符。但在sql命令控制台中,sql语句插入中文,最后查询出来,结果都是以?代替的。看着非常头疼。我刚开始都是在phpmyadmin中 设置...
  • LuoSiSan
  • LuoSiSan
  • 2014年12月05日 17:07
  • 3077

windows环境下新建.txt文件,使其默认以UTF-8编码

问题的引出: windows环境下新建.txt文件,默认以ANSI格式编码。这种格式编码的文件,放到ubuntu上很可能会乱码。于是我就想,如何设置windows,才能使新建的.txt文件默认以UT...
  • u013490896
  • u013490896
  • 2017年03月12日 17:52
  • 1570

如何设置Eclipse新建项目的默认编码方式

问题描述 今天用SVN代码合并的时候 遇到1个问题 我们进行的是Android项目 合并之后整个Android APP都是乱码 后来看了一下原因 就是项目的编码有问题 我使用的是Windows系统默...
  • songyuc
  • songyuc
  • 2016年03月31日 11:41
  • 2115

哈夫曼树以及哈夫曼编码的创建

#include #include #define Maxvalue 20 #define Maxleaf 15 #define Maxnode (2*Maxleaf-1) int n=0,len,j...
  • liguohanhaha
  • liguohanhaha
  • 2016年01月19日 10:21
  • 1040

修改MyEclipse下创建Web项目中新建Jsp的默认编码格式

在MyEclipse下创建Web项目,在WebRoot下新建Jsp文件时,默认的编码格式是:ISO-8859-1,如下图。在这个编码格式下,中文会出现乱码问题。但是每次去修改这个编码又特别麻烦,我们可...
  • lc1351290389
  • lc1351290389
  • 2015年12月18日 22:08
  • 2804

mac下改变已经创建的数据库的字符编码问题

MySQL的默认字符编码是 latin1,如果没有在创建数据的时候没有改变编码方式,那么数据库里面存放中文数据的时候,中文会变成?,解决办法是在配置文件里面改变编码方式,解决的办法如下: 1...
  • Haskei
  • Haskei
  • 2017年05月24日 21:04
  • 398

Linux-MySQL数据库编码集设置为utf8

在MySQL数据库中, 当插入数据无法支持中文时, 可将该数据库的编码集设置为utf8, 故在创建数据库时, 将数据库编码集及其他字符编码设置为utf8。 如果之前创建的数据库的数据库编码集不为ut...
  • hustwht
  • hustwht
  • 2016年09月20日 17:33
  • 1417

python操作Mysql入库,编码(乱码问题)解决

系统环境:ubuntu 14.04 mysql版本:5.5 使用python操作mysql相对简单,但是要注意数据的编码问题.刚开始使用英文入库,没有出现问题,但是看到网上有人说编码问题,就试...
  • cdd801
  • cdd801
  • 2015年03月19日 14:22
  • 816

hive设置mysql元数据编码问题

文章来自: http://blog.csdn.net/lili72 Mysql默认安装,建表时出现如下异常。 FAILED: Error in metadata: javax.jdo.JDOData...
  • lili72
  • lili72
  • 2013年08月31日 11:07
  • 3468

Android 新建文件夹,新建Txt,解决中文乱码问题

之前的准备要做好,权限声明。 没有权限的话,文件夹新建不了,Txt新建不了。 第一步,获取手机路径,有无SD卡均适应。 public static S...
  • weixin_36838630
  • weixin_36838630
  • 2018年01月05日 14:34
  • 108
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:哈夫曼树的创建以及编码
举报原因:
原因补充:

(最多只允许输入30个字)