1、此程序为c++程序

2、以下代码可实现手动输入,即去掉代码中的/*...*/注释符,并同时去掉赋值代码段

3、源代码

#include<iostream>

using namespace std;

typedef struct

{

int weight, parent, lchild, rchild;

}HTNode,*HuffmanTree;

typedef char **HuffmanCode;

typedef struct

{

int weight, locate;

}TNode,*Temp;

void CreatHuffmanTree(HuffmanTree &HT, int n);

void CreatHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n);

int main()

{

HuffmanTree HT;

HuffmanCode HC;

int n = 8;

char p = 'y';

while (p=='y')

{

/*cout << "请输入待编码数据的个数:";

cin >> n;*/

CreatHuffmanTree(HT, n);

CreatHuffmanCode(HT, HC, n);

cout << "再次执行请输入:y,不执行请输入:n" << endl;

cin >> p;

}

system("pause");

return 0;

}

//生成哈夫曼树

void CreatHuffmanTree(HuffmanTree &HT, int n)

{

int i, j, k, s1, s2, num;

HT = new HTNode[2 * n];

for (i = 1; i < 2 * n; i++)

{

HT[i].parent = 0;

HT[i].lchild = 0;

HT[i].rchild = 0;

}

/*cout << "请输入数据:";

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

{

cin >> HT[i].weight;

}*/

HT[1].weight = 5;

HT[2].weight = 29;

HT[3].weight = 7;

HT[4].weight = 8;

HT[5].weight = 14;

HT[6].weight = 23;

HT[7].weight = 3;

HT[8].weight = 11;

for (i = n + 1; i < 2 * n; i++)

{

//从1~i-1中选取两个双亲为0,且权值最小的结点的下标

//统计1~i-1中双亲为0的结点的个数

num = 0;

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

{

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

{

num++;

}

}

//将双亲为0的结点的权值和下标存储进一个新的结构体数组中

Temp T;

T = new TNode[num];

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

{

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

{

T[j].weight = HT[k].weight;

T[j].locate = k;

j++;

}

}

//选择排序

for (j = 0; j < num - 1; j++)

{

for (k = j + 1; k < num; k++)

{

if (T[j].weight > T[k].weight)

{

TNode temp;

temp = T[k];

T[k] = T[j];

T[j] = temp;

}

}

}

s1 = T[0].locate;

s2 = T[1].locate;//选取下标结束

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;

delete T;

}

cout << "哈夫曼树:" << endl;

for (i = 1; i < 2 * n; i++)

{

cout << HT[i].weight << '\t' << HT[i].parent << '\t' << HT[i].lchild << '\t' << HT[i].rchild << endl;

}

}

//哈夫曼编码

void CreatHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n)

{

int i, c, f,start;

char *cd;

HC = new char*[n + 1];

cd = new char[n];

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

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

{

start = n - 1;

c = i;

f = HT[i].parent;

while (f != 0)

{

start--;

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

{

cd[start] = '0';

}

else

{

cd[start] = '1';

}

c = f;

f = HT[f].parent;

}

HC[i] = new char[n - start];

strcpy_s(HC[i], n + 1, &cd[start]);

}

delete cd;

cout << "哈夫曼编码:";

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

{

cout << HC[i];

}

cout << endl;

}

Huffman编码(测试源代码)的更多相关文章

  1. [老文章搬家] 关于 Huffman 编码

    按:去年接手一个项目,涉及到一个一个叫做Mxpeg的非主流视频编码格式,编解码器是厂商以源代码形式提供的,但是可能代码写的不算健壮,以至于我们tcp直连设备很正常,但是经过一个UDP数据分发服务器之后 ...

  2. Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

    前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的re ...

  3. DS二叉树--Huffman编码与解码

    题目描述 1.问题描述 给定n个字符及其对应的权值,构造Huffman树,并进行huffman编码和译(解)码. 构造Huffman树时,要求左子树根的权值小于.等于右子树根的权值. 进行Huffma ...

  4. 《F4+2—团队项目设计完善&编码测试》

    1:根据OOD详细设计工作要点,修改完善团队项目系统设计说明书和详细设计说明       a.软件系统设计说明书的完善 将测试启动准则,测试结束准则,测试暂停/中止标准加到了测试计划中.将把在测试中会 ...

  5. Huffman编码(Huffman树)

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "Huffman编码(Huffman树)" 的idea 并用源代码加以实现: 0.2) ...

  6. Huffman编码实现压缩解压缩

    这是我们的课程中布置的作业.找一些资料将作业完毕,顺便将其写到博客,以后看起来也方便. 原理介绍 什么是Huffman压缩 Huffman( 哈夫曼 ) 算法在上世纪五十年代初提出来了,它是一种无损压 ...

  7. Huffman编码和解码

    一.Huffman树 定义: 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径达到最小,这样的二叉树称为最优二叉树,也称为霍夫曼树(Huffman树). 特点:     Huffman树 ...

  8. Huffman编码

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <cstri ...

  9. 【数据压缩】Huffman编码

    1. 压缩编码概述 数据压缩在日常生活极为常见,平常所用到jpg.mp3均采用数据压缩(采用Huffman编码)以减少占用空间.编码\(C\)是指从字符空间\(A\)到码字表\(X\)的映射.数据压缩 ...

随机推荐

  1. php file_get_contents() 用法

    php 需要访问某个网页 <?php $fh= file_get_contents('http://www.baidu.com/'); echo $fh; ?> 知识扩充 file_get ...

  2. CALayer 4 详解 -----转自李明杰

    CALayer4-自定义层   本文目录 一.自定义层的方法1 二.自定义层的方法2 三.其他 自定义层,其实就是在层上绘图,一共有2种方法,下面详细介绍一下. 回到顶部 一.自定义层的方法1 方法描 ...

  3. 关于XE10下Indy发送字符串编码的问题

    在与硬件对接的过程中,之前用D7环境下的UDPServer.Post发送的指令,硬件可正常识别并正常显示, 后来使用到XE10,重新编译之前的源码,发现所有汉字乱码显示了: 后通过对接收数据发现,实际 ...

  4. html5之canvas画图基础

    HTML5+CSS3的好处是,你可以编写一个页面分别用于不同的平台,只需要设置不同的css样式就可以了,现在基本主流浏览器都支持全新的HTML5和CSS3,因为它的跨平台开发.因为是原生代码所以它的页 ...

  5. Spring学习笔记

    Spring 的控制反转:把对象的创建.初始化.销毁等工作交给Spring 容器来做,有spring容器控制对象的生命周期 applicationContext.xml beans --->sp ...

  6. SharpDevelop学习笔记(5)—— AddIns系统详解

    在所有的插件被加载到指定的扩展点后,插件树就被创建完毕了, 但是,我们知道,插件树创建后,每个插件在插件树的位置在就固定的,但是,如果某些情况下,我们希望一些插件不可使用或应该隐藏起来, 或者说有的插 ...

  7. MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(03)

    1.3.2 MFC如何使用应用程序对象 MFC程序没有main函数,没有WinMain函数,到底是什么启动了程序的运行? 一个MFC提供的源代码中(Winmain.cpp)包含了一个AfxWinMai ...

  8. 浅谈Extjs radiogroup change事件与items下的checked属性

    在使用Extjs制作crud时,由于添加和修改界面的高度相似,使用了相同的row字段. 在角色字段中使用了change监听事件,用于动态的无效化权限分配字段,因为权限分配界面默认没有隐藏,设定了che ...

  9. 利用Volley封装好的图片缓存处理加载图片

    Volley 工具箱中提供了一种通过 DiskBasedCache 类实现的标准缓存.这个类能够缓存文件到磁盘的指定目录.但是为了使用 ImageLoader,我们应该提供一个自定义的内存 LRC b ...

  10. 例子:Background Transfer Service Sample

    本例演示了如何使用后台传输服务来进行后台文件下载,也就是说及时App已经停止运行,同样可以通过后台代理进行文件的下载操作. 对于后台文件传输一下知识点必须注意: 1. 通过使用 BackgroundT ...