发现自己写程序的问题很多,对着算法实现代码,也花费了不短的时间才把问题搞定,很是郁闷。

问题多多。

现将代码贴出,以备查询。

#include<cctype>
#include<cstdlib>
#include<cstdio>
#include<cstring>

typedef struct {
    unsigned int weight;
    unsigned int parent, lchild,rchild;
}HTNode, *HuffmanTree;
typedef char ** HuffmanCode;

//find the min value of two item in Tree
void Select(HuffmanTree &HT,unsigned int i, unsigned int &min1,unsigned int &min2)
{  
    unsigned int tmp=HT[1].weight,j=0,t=1;
  //  for(t=1;HT[t].parent!=0;t++);
    while(HT[t].parent>0)
        t++;
    for( j=1,min1=t;j<= i; j++){
    if(HT[j].parent==0&&HT[j].weight<HT[min1].weight)
        min1=j;
    }
for(j=1,min2=t;j<=i;j++)
{
if((HT[j].parent==0)&&(HT[j].weight<HT[min2].weight)&&(!(j==min1)))
          min2=j;
}
if(min1==min2)
{
    do
   {  t++;
   }while(HT[t].parent>0);
   for(j=1,min2=t;j<=i;j++)
    {
     if((HT[j].parent==0)&&(HT[j].weight<HT[min2].weight)&&(!(j==min1)))
          min2=j;
     }
   }
 }
void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, unsigned int *w,unsigned int n)
{
  unsigned  int i,s1=1,s2=1;
  unsigned  int m ,start;
  unsigned int k;
  HuffmanTree p;
  //*p={ *w,0,0,0};
    char *cd;
    if(n<=1) return;
    m=2*n-1;
   
    HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
    HTNode HN;
      //  HN={*w,0,0,0};
    p=HT;
    for(p=p+1,i=1;i<=n;++i,++p,++w)
    {
        p->weight=*w;
        p->lchild=0;
        p->parent=0;
        p->rchild=0;
        //*p={*w,0,0,0};
    }
    for(;i<=m;++i,++p)
         {
        p->weight=0;
        p->lchild=0;
        p->parent=0;
        p->rchild=0;
        //*p={*w,0,0,0};
    }
       // *p={0,0,0,0};
    for(i=n+1;i<=m;++i)//Create HuffmanTree
    {
    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("%6d  %6d   %6d   %6d %d\n",HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild,i);
    }
//get the Huffman code
    HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
    cd=(char *)malloc(n*sizeof(char));
    cd[n-1]='\0';

for(k=1;k<=m;++k)
    {
    printf("%6d  %6d   %6d   %6d   %7d\n",HT[k].weight,HT[k].parent,HT[k].lchild,HT[k].rchild,k);
    }
    for(k=1;k<=n;++k)
    {
        unsigned int c,f;
        start = n-1;
        for(c=k, f=HT[k].parent;f != 0;c=f, f=HT[f].parent)
        {
            if(HT[f].lchild==c)
                cd[--start]='0';
            else cd[--start]='1';
        }
            HC[k] = (char *)malloc((n-start)*sizeof(char));
        //    printf("cd is %s\n", cd);
            strcpy(HC[k],&cd[start]);
            printf("k %6d is %s  \n", k,HC[k]);
    }
   
    free(cd);
}

void main()
{
    unsigned int a[]={5,29,7,8,14,23,3,11};
    unsigned int *w=a;
   /* for(int i=1;i<=8;i++,w++)
        printf("%d\n",*w);
    w=a;*/
    HuffmanTree HT;
    HuffmanCode HC;
HuffmanCoding(HT,HC, w,  8);
for(int i=1;i<=8;i++)
        printf("%S  %6d",HC[i],HT[i].weight);

//printf("%d\n",*(w+1));
system("pause");

}

总结:1,cpp用的并不熟,内部变量,局部变量与函数变量不熟悉。

2,逻辑算法能力有待提高,加强训练。

转载于:https://www.cnblogs.com/seasidy/archive/2011/06/24/2088991.html

赫夫曼编码c++中的实现相关推荐

  1. 算法系列之赫夫曼编码实战一【数据压缩、数据解压】

    1.何谓赫夫曼编码? 2.赫夫曼数据压缩 3.赫夫曼数据解压 4.全代码 1.何谓赫夫曼编码? 哈夫曼编码是一种编码方式,哈夫曼编码是可变字长编码的一种.Huffman于1952年提出一种编码方法,该 ...

  2. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

  3. 赫夫曼树(Haffman)及其运用

    赫夫曼树,别名"哈夫曼树"."最优树"以及"最优二叉树". 概念: 路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径. (从根结点 ...

  4. 数据结构与算法期末复习总结

    为了方便复习 下面内容摘自:数据结构期末总结_夏日 の blog-CSDN博客_数据结构期末 目录 绪论 知识点 习题 线性表 知识点 习题 栈和队列 知识点 习题 串.数组和广义表 知识点 树和二叉 ...

  5. 【数据结构】哈夫曼树及哈夫曼编码

    哈夫曼树 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...

  6. 面试:第十二章:所有总结

    Java基础 java基本类型哪些,所占字节 byte :1个字节 short :2个字节 char :2个字节 int :4个字节 long :8个字节 float :4个字节 double :8个 ...

  7. linux内核分析(转自某位大哥网上的笔记)

    启动 当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处的代码,也就是ROM-BIOS起始位置的代码.BIOS先进行一系列的系统自检,然后初始化位于地址0的中断 ...

  8. 假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10. 试为这8个字母设计赫夫曼编码.

    哈夫曼编码 [问题描述] 假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10. 试为这8个字母 ...

  9. 赫夫曼编码(基于赫夫曼树的实现)

    上一篇文章中我们探讨了赫夫曼树的基本原理和构造方式,而赫夫曼编码可以很有效地压缩数据(通常可以节约20%-90%的空间,具体压缩率依赖于数据的特性). 名词:定长编码,边长编码,前缀码(装B用的) 定 ...

最新文章

  1. 安装慢_Origin平台安装更新慢的解决办法
  2. Mysqldump备份和恢复
  3. Flink on Zeppelin (4) - 机器学习篇
  4. 想“跟”在后面?不是那么简单的事情
  5. 用AlphaGo背后的人工智能做金融投资
  6. [En]Web Forms Syntax Reference
  7. 【转】单循环赛赛程安排算法研究
  8. Pytorch入门教程学习笔记(六)循环神经网络RNN(学周杰伦写歌)
  9. 【算法】ACO蚂蚁寻路最短路径TSP问题-多篇文章总结
  10. 【渝粤教育】广东开放大学 商务谈判 形成性考核 (34)
  11. 阿里云OSS图片文件和html文件无法直接打开,只能下载
  12. Datawhale组队学习——Pytorch进阶训练技巧
  13. 5 kyu some egyptian fractions
  14. 安霸Alberto Broggi :计算机视觉技术驱动自动驾驶的发展 | 2019 AI+智能汽车创新峰会... 1
  15. 辅助知识-第2 章 项目合同管理
  16. 全面剖析亚马逊,让你开店不迷茫!
  17. 海康威视2019年校园招聘内推码(2019届春招、2020届实习/秋招)
  18. 易飞9.0.12官方正版安装程序下载地址
  19. 计算机辅助三维诊断英文,人体CT图像的三维可视化(英文)
  20. 华为网络篇 使用SSH方式登陆路由器-06

热门文章

  1. mysql 递归查找父节点_MYSQL递归查询,根据子类ID查询所有父类(最全)
  2. php中rowcount 意思,PHP PDOStatement::rowCount讲解
  3. 头条号个人中心登录_微信个人订阅号开通了创作领域的认证!这是要跟头条看齐了吗?...
  4. mysql的root用户密码_MySQL的root用户密码忘了 , 该怎么办?
  5. datax 模板_dataX3.0安装使用手册.docx
  6. python ui自动化测试框架_基于python语言下的UI自动化测试框架搭建(一)
  7. html如何显示带有记号的文本,如何使用Wicket设置HTML锚标记的显示文本?
  8. Android画布的保存,Android canvas用法介绍之save()和restore()
  9. 现在的python版本_现在python 流行哪个版本
  10. Nexys4 DDR + OV7670 摄像头实时监控系统