`
鱼吃猫
  • 浏览: 8235 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

(数据结构)Huffman树和编码

阅读更多
#include <STDIO.H>
#include <stdlib.h>
#include <string.h>

typedef unsigned int unint;
#define MAX 1000;

typedef struct  
{
	unint weight;
	unint parent, lchild, rchild;
}HTNode, *HuffmanTree;

typedef char ** HuffmanCode;


void Select(HuffmanTree &HT, unint n, unint &s1num, unint &s2num)
{
	unint tempMin, tempNum;
	unint i;
	unint s1, s2;
	
	s1 = s2 = MAX;

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

				tempNum = s2num;
				s2num = s1num;
				s1num = tempNum;
			}
		}
	if (0 == HT[s2num].lchild)
	{
		tempNum = s2num;
		s2num = s1num;
		s1num = tempNum;
	}
}

void HuffmanCoding( HuffmanTree &HT, HuffmanCode &HC, unint *w, unint n )
{	// w存放n个字符的权值(均>0),构造Huffman树HT,并求出n个字符的Huffman编码HC。
	unint m, i, start, c, s2, s1, f;

	HuffmanTree p;
	char *cd;

	if (n <= 1)		return;
	m = 2 * n - 1;
	HT = (HuffmanTree) malloc ( (m + 1) * sizeof(HTNode) );// 0号单元未用

	for (p = HT + 1, i = 1; i <= n; ++i, ++p, ++w)
	{
	//	*p = { *w, 0, 0, 0 };
		p->weight = *w;
		p->parent = 0;
		p->lchild = 0;
		p->rchild = 0;
	}
	for (; i <= m; ++i, ++p)
	{
		//*p = { 0, 0, 0, 0};
		p->weight = 0;
		p->parent = 0;
		p->lchild = 0;
		p->rchild = 0;
	}
	for (i = n+1; i <= m; ++i)// 建Huffman树
	{
		Select(HT, i - 1, s1, s2);
		// 在HT[1..i-1]选择parent为0且weight最小的两个结点,其序号分别为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;
	}

	//----从叶子到根逆向求每个字符的Huffman编码------------
	HC = (HuffmanCode) malloc ( (n + 1) * sizeof(char *) );// 分配n个字符编码的头指针向量
	cd = (char *) malloc (n * sizeof(char));// 分配求编码的工作空间
	cd[n - 1] = '\0';						// 编码结束符
	for (i = 1; i <= n; ++i)				// 逐个字符求Huffman编码
	{
		start = n - 1;
		for (c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)// 从叶子到根逆向求编码
			if (c == HT[f].lchild)
				cd[-- start] = '0';
			else
				cd[-- start] = '1';
		HC[i] = (char *) malloc ( (n - start) * sizeof(char) );// 为第i个字符编码分配空间
		strcpy(HC[i], &cd[start]);								// 从cd复制编码(串)到HC
		printf("%s\n",HC[i]);
		free(HC[i]);
	}
	free(HT);// 释放工作空间
	free(cd);
	free(HC);
}

int main()
{
	HuffmanTree HT;
	HuffmanCode HC;
	unint w[8]={5, 29, 7, 8, 14, 23, 3, 11};
	unint n = 8;

	HuffmanCoding(HT, HC, w, n);

	return 0;
}

 不清楚有木有错~ 求大牛带

分享到:
评论

相关推荐

    C语言实现Huffman树,Huffman编码

    通过阅读和理解这些代码,可以加深对Huffman编码和数据结构的理解,并能够动手实现一个简单的数据压缩工具。 总之,Huffman编码是数据压缩领域的一个经典案例,它利用了数据的统计特性,实现了高效的数据压缩。...

    Huffman树 及 Huffman编码 演示程序

    此外,对于动态变化的数据流,Huffman编码的效率会降低,因为它需要不断更新树结构。 总结来说,“Huffman树及Huffman编码演示程序”是一个教育工具,可以帮助用户通过图形化界面理解Huffman编码的工作原理,从而...

    huffman树_Huffman树_C++_huffman_数据结构_

    哈夫曼树(Huffman Tree),也称为最优二叉树,是数据压缩中常用的一种数据结构。它是一种带权路径长度最短的二叉树,由哈夫曼在1952年提出,用于解决“最小带权路径长度”问题。在哈夫曼树中,频率较高的字符对应的...

    数据结构上机实验 Huffman编码(二叉树) C语言

    数据结构: #define n 100 //叶子结点数 #define m 2*n-1 // Huffman树中结点总数 typedef struct { int weight; //权值 int lchild , rchild , parent; //左右孩子及双亲指针 }HTNode; //树中结点类型 typedef ...

    数据结构Huffman编码

    它是基于二叉树的数据结构,主要用于创建一种特殊的前缀编码(也称为前缀码或无歧义编码),其中每个字符的编码都不会是其他字符编码的前缀,避免了解码过程中的歧义。 在Huffman编码的过程中,首先需要构建一个...

    【实验三】Huffman树及Huffman编码的算法实现1

    Huffman树,又称最优二叉树...总的来说,这个实验旨在让你深入理解Huffman编码和树的构建过程,并通过实际操作体验其在数据压缩中的应用。通过编写和调试代码,你不仅能巩固数据结构知识,还能提高问题解决和编程能力。

    Huffman 编码器与解码器-----数据结构课程设计(C++源码和报告)

    在本课程设计的项目中,提供的"06082130"文件可能包含了C++源代码实现以上步骤,以及可能有的测试文件和报告,用于展示Huffman编码和解码的完整流程和性能分析。通过这个项目,学生可以深入理解Huffman编码的工作...

    数据结构 Huffman树的应用

    数据结构中的Huffman树,又称为最优二叉树或赫夫曼树,是根据赫夫曼编码(Huffman Coding)理论构建的一种特殊的二叉树。它在计算机科学中有着广泛的应用,特别是在数据压缩领域,例如在文件压缩软件中。本文将深入...

    数据结构中huffman编码与译码

    在本例中,"asan_huffman_OK.rar"可能包含了一个实现哈夫曼编码和译码的程序,而"李若谷_数据结构_huffman.doc"可能是关于哈夫曼编码的详细设计文档,包括算法的描述、步骤以及可能的设计决策。 哈夫曼编码的优化和...

    Huffman 树 编码解码

    Huffman编码是一种高效的数据压缩方法,它基于字符出现频率构建一棵特殊的二叉树——Huffman树,以此来为每个字符分配唯一的二进制编码。在信息传输或存储时,使用这种编码可以显著减少数据量,因为频繁出现的字符...

    Huffman树编码解码

    在编码和解码过程中,代码利用栈的思想(尽管【描述】中提到采用栈,但实际操作中并未明确使用栈),通过递归函数的调用来遍历树结构,生成和还原编码。 综上所述,霍夫曼树编码解码的核心概念和实现过程涉及到了...

    Huffman树及Huffman编码的算法实现.zip

    本实验报告中,"【实验三】Huffman树及Huffman编码的算法实现"可能包含了详细的代码实现,展示了如何使用编程语言(如C++、Java或Python)来实现上述步骤。实验可能会包括测试不同频率分布的字符集,以及对比不同...

    Huffman树编码问题

    关于Huffman树的编码问题,适合基础薄弱的学生转载

    Huffman编码树通过MATLAB实现

    Huffman编码是一种高效的数据压缩算法,它基于一种称为Huffman树(或Huffman编码树)的数据结构。在MATLAB环境中实现Huffman编码树,可以让我们更深入地理解该算法的工作原理,并能应用于实际的文件压缩。 首先,...

    数据结构课程设计-huffman编码

    - `main.c`:主程序,调用Huffman编码和解码的函数,处理输入输出文件。 - `test.txt`:测试数据文件,用于演示编码和解码过程。 - `encoded.bin`:编码后的二进制文件。 - `decoded.txt`:解码后的文本文件。 通过...

    Huffman编码 程序 数据结构实验

    在主函数`main`中,用户输入字符和权值,然后调用这两个函数进行编码和树的构建。程序最后输出生成的Huffman编码以及Huffman树的结构。 总结来说,Huffman编码是一种高效的数据压缩算法,通过构建特定的二叉树来...

    Huffman树的表示及Huffman编码

    4. 提供编码和解码功能,将原始文本转化为Huffman编码,或将Huffman编码还原为原始文本。 在给定的程序源代码中,`main`函数首先读取用户输入的字符及其频率,然后构建Huffman树,并利用树结构生成编码。然而,这段...

Global site tag (gtag.js) - Google Analytics