数据结构哈夫曼编码-(C语言代码)

cs 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXVALUE 32767
#define NODENUM 8//叶子结点数
typedef struct
{
	char data;
	int weight;
	int parent, lch, rch;
}htNode,*huffmanTree;
typedef char** huffmanCode;
void initHuffmanTree(huffmanTree* HT)
{
	*HT = (htNode*)malloc(sizeof(htNode) * 2 * NODENUM);//2n
	if (*HT == NULL)
	{
		perror("error");
		exit(1);
	}
	//初始化都为-1
	for (int i = 1; i <= 2 * NODENUM - 1; i++)//n个叶子结点有2n-1个结点
	{
		(*HT)[i].parent = (*HT)[i].rch = (*HT)[i].lch = -1;
	}
	printf("请输入%d个叶子结点的权值\n", NODENUM);
	for (int i = 1; i <= NODENUM; i++)
	{
		scanf("%d", &((*HT)[i].weight));
	}
	char c = getchar();//吸收上面scanf残留的换行符
	printf("请输入data的字母符号,并且换行符结束\n");
	for (int i = 1; i <= NODENUM; i++)
	{
		char a = getchar();
		if (a == '\n')
		{
			break;
		}
		else
		{
			(*HT)[i].data = a;
		}
	}
}
void createHuffmanTree(huffmanTree* HT, int n)
{
	if (n<=1)
	{
		return;
	}
	int min1, min2;
	int rnode, lnode;
	for (int i = n + 1; i <= 2 * n - 1; i++)
	{
		min1 = MAXVALUE, lnode = -1;
		min2 = MAXVALUE, rnode = -1;
		for (int j = 1; j <= i - 1; j++)
		{
			if ((*HT)[j].weight < min1 && (*HT)[j].parent == -1)
			{
				min2 = min1, rnode = lnode;
				min1 = (*HT)[j].weight, lnode = j;
			}
			else if ((*HT)[j].weight < min2 && (*HT)[j].parent == -1)
			{
				min2 = (*HT)[j].weight;
				rnode = j;
			}
		}
		(*HT)[lnode].parent = (*HT)[rnode].parent = i;
		(*HT)[i].lch = lnode, (*HT)[i].rch = rnode;
		(*HT)[i].weight = (*HT)[lnode].weight + (*HT)[rnode].weight;
	}
}
void createHuffmanTreeCode(huffmanTree HT, huffmanCode* HC, int n)//HC三级
{
	*HC = (char**)malloc(sizeof(char*) * n + 1);//0号单元不使用,给HC分配十个空间,一个空间里面又是一个小数组,这个小数组在下面根据宽度申请空间
	if (*HC == NULL)
	{
		perror("error");
		exit(1);
	}
	char* cd = (char*)malloc(sizeof(char) * n);//临时存放的十个空间的字符数组
	if (cd == NULL)
	{
		perror("error");
		free(*HC);//cd开辟失败就把HC也关闭
		exit(1);
	}
	int start = 0;//作为临时数组的下标索引
	int c = 0;//根据i的数值去定位下标权值weight i = 1 对于权值第一位的是5
	int f = 0;//代表双亲parent
	cd[n - 1] = '\0';
	for (int i = 1; i <= n; i++)
	{
		start = n - 1;//因为从叶子结点到根结点,所以存放在临时数组的0和1要在临时数组中倒着放
		c = i;//c不是真的为1,是1对于的下标权值weight这里切记
		f = HT[c].parent;//f为c对应的parent,单单对应parent的数字就行,不要去对标这个parent的权值
		while (f!=-1)
		{
			start--;//上面的start = n-1是对应\0的位置,需要再往后一格
			if (HT[f].lch == c)
			{
				cd[start] = '0';
			}
			else {
				cd[start] = '1';
			}
			//不断网上走,直到根节点
			c = f;
			f = HT[c].parent;
		}
		(*HC)[i] = (char*)malloc(sizeof(char) * (n - start));
		if ((*HC)[i] == NULL)
		{
			perror("error");
			return;
		}
		strcpy((*HC)[i], &cd[start]);
	}
	free(cd);
}
int main()
{
	huffmanTree HT = NULL;//一级
	//初始化
	initHuffmanTree(&HT);

	huffmanCode HC;
	createHuffmanTree(&HT, NODENUM);
	createHuffmanTreeCode(HT, &HC, NODENUM);

	//输出编码
	for (int i = 1; i <= NODENUM; i++)
	{
		printf("%c:\t", HT[i].data);
		printf("%s\n", HC[i]);
	}
	return 0;
}
相关推荐
爱coding的橙子7 分钟前
每日算法刷题Day70:10.13:leetcode 二叉树10道题,用时2h
算法·leetcode·深度优先
Syntech_Wuz22 分钟前
从 C 到 C++:容器适配器 std::stack 与 std::queue 详解
数据结构·c++·容器··队列
ghie909033 分钟前
基于MATLAB的遗传算法优化支持向量机实现
算法·支持向量机·matlab
朝新_1 小时前
【优选算法】第一弹——双指针(上)
算法
艾莉丝努力练剑2 小时前
【C++STL :stack && queue (一) 】STL:stack与queue全解析|深入使用(附高频算法题详解)
linux·开发语言·数据结构·c++·算法
kyle~2 小时前
计算机系统---CPU的进程与线程处理
linux·服务器·c语言·c++·操作系统·计算机系统
CoovallyAIHub2 小时前
ICLR 2026 惊现 SAM 3,匿名提交,实现“概念分割”,CV领域再迎颠覆性突破?
深度学习·算法·计算机视觉
IT古董2 小时前
【第五章:计算机视觉-计算机视觉在工业制造领域中的应用】1.工业缺陷分割-(2)BiseNet系列算法详解
算法·计算机视觉·制造
电鱼智能的电小鱼2 小时前
服装制造企业痛点解决方案:EFISH-SBC-RK3588 预测性维护方案
网络·人工智能·嵌入式硬件·算法·制造
yan8626592462 小时前
于 C++ 的虚函数多态 和 模板方法模式 的结合
java·开发语言·算法