基于visual Studio2013解决算法导论之047赫夫曼编码_结点

 

题目

赫夫曼编码

 

解决代码及点评
// 赫夫曼编码.cpp : 定义控制台应用程序的入口点。
//

#include <iostream>
#include <stdio.h>
using namespace std;

#define MAXBIT      100
#define MAXVALUE  10000
#define MAXLEAF     30
#define MAXNODE    MAXLEAF*2 -1

typedef struct 
{
	int bit[MAXBIT];
	int start;
} HCodeType;        /* 编码结构体 */
typedef struct
{
	int weight;
	int parent;
	int lchild;
	int rchild;
} HNodeType;        /* 结点结构体 */

/* 构造一颗哈夫曼树 */
void HuffmanTree (HNodeType HuffNode[MAXNODE],  int n)
{ 
	/* i、j: 循环变量,m1、m2:构造哈夫曼树不同过程中两个最小权值结点的权值,
	x1、x2:构造哈夫曼树不同过程中两个最小权值结点在数组中的序号。*/
	int i, j, m1, m2, x1, x2;
	/* 初始化存放哈夫曼树数组 HuffNode[] 中的结点 */
	for (i=0; i<2*n-1; i++)
	{
		HuffNode[i].weight = 0;
		HuffNode[i].parent =-1;
		HuffNode[i].lchild =-1;
		HuffNode[i].lchild =-1;
	} /* end for */

	/* 输入 n 个叶子结点的权值 */
	for (i=0; i<n; i++)
	{
		printf ("节点 %d 的权重: \n", i);
		scanf ("%d", &HuffNode[i].weight);
	} /* end for */

	/* 循环构造 Huffman 树 */
	for (i=0; i<n-1; i++)
	{
		m1=m2=MAXVALUE;     /* m1、m2中存放两个无父结点且结点权值最小的两个结点 */
		x1=x2=0;
		/* 找出所有结点中权值最小、无父结点的两个结点,并合并之为一颗二叉树 */
		for (j=0; j<n+i; j++)
		{
			if (HuffNode[j].weight < m1 && HuffNode[j].parent==-1)
			{
				m2=m1; 
				x2=x1; 
				m1=HuffNode[j].weight;
				x1=j;
			}
			else if (HuffNode[j].weight < m2 && HuffNode[j].parent==-1)
			{
				m2=HuffNode[j].weight;
				x2=j;
			}
		} /* end for */
		/* 设置找到的两个子结点 x1、x2 的父结点信息 */
		HuffNode[x1].parent  = n+i;
		HuffNode[x2].parent  = n+i;
		HuffNode[n+i].weight = HuffNode[x1].weight + HuffNode[x2].weight;
		HuffNode[n+i].lchild = x1;
		HuffNode[n+i].rchild = x2;

		printf ("x1.weight  x2.weight  %d: %d, %d\n", i+1, HuffNode[x1].weight, HuffNode[x2].weight);  /* 用于测试 */
		printf ("\n");
	}
}

int main(void)
{
	HNodeType HuffNode[MAXNODE];            /* 定义一个结点结构体数组 */
	HCodeType HuffCode[MAXLEAF],  cd;       /* 定义一个编码结构体数组, 同时定义一个临时变量来存放求解编码时的信息 */
	int i, j, c, p, n;
	printf ("输入 n:\n");
	scanf ("%d", &n);
	HuffmanTree (HuffNode, n);

	for (i=0; i < n; i++)
	{
		cd.start = n-1;
		c = i;
		p = HuffNode[c].parent;
		while (p != -1)   /* 父结点存在 */
		{
			if (HuffNode[p].lchild == c)
				cd.bit[cd.start] = 0;
			else
				cd.bit[cd.start] = 1;
			cd.start--;        /* 求编码的低一位 */
			c=p;                    
			p=HuffNode[c].parent;    /* 设置下一循环条件 */
		} /* end while */

		/* 保存求出的每个叶结点的哈夫曼编码和编码的起始位 */
		for (j=cd.start+1; j<n; j++)
		{ HuffCode[i].bit[j] = cd.bit[j];}
		HuffCode[i].start = cd.start;
	} /* end for */

	/* 输出已保存好的所有存在编码的哈夫曼编码 */
	for (i=0; i<n; i++)
	{
		printf (" Huffman 编码: ", i);
		for (j=HuffCode[i].start+1; j < n; j++)
		{
			printf ("%d", HuffCode[i].bit[j]);
		}
		printf ("\n");
	}
	system("pause");
	return 0;
}




代码下载及其运行

解压密码:c.itcast.cn

 

下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:

1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”

基于visual Studio2013解决算法导论之047赫夫曼编码_i++_02

2)在下拉框中选择相应项目,项目名和博客编号一致

基于visual Studio2013解决算法导论之047赫夫曼编码_哈夫曼编码_03

3)点击“本地Windows调试器”运行

基于visual Studio2013解决算法导论之047赫夫曼编码_i++_04

 

程序运行结果

基于visual Studio2013解决算法导论之047赫夫曼编码_权值_05