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

news/2024/10/15 10:12:21/
#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);//2nif (*HT == NULL){perror("error");exit(1);}//初始化都为-1for (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 对于权值第一位的是5int f = 0;//代表双亲parentcd[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;
}

 

 


http://www.ppmy.cn/news/1539384.html

相关文章

Mac 编译 Unreal 源码版本

Mac M3 Pro、XCode 16.0、Unreal 5.4 分享下我本地操作的全流程和遇到的问题 安装 XCodeGithubDesktop 克隆自己 Fork 的仓库运行 Setup.command运行 GenerateProjectFiles.command 出现警告&#xff1a;Platform Mac is not a valid platform to build. Check that the SDK i…

Mac 查看编译器默认使用C++标准

Mac 查看编译器默认使用的C标准 C标准 对应关系 #include<iostream> using namespace std;int main(){//__cplusplus这个宏中记录了当前使用的版本cout << __cplusplus << endl;//C pre-C98: __cplusplus is 1.// C98: __cplusplus is 199711L.// C11: __c…

第四章 RabbitMQ快速入门

目录 1. 新建队列 2. 点击进入amq.fanout交换机 3. 绑定队列和交换机 4. 发送消息 5. 查看消息 6. 添加虚拟主机 7. 添加用户 ​编辑 8. 为虚拟主机添加访问用户 本章节我们通过RabbitMQ的客户端界面&#xff0c;通过简单的创建队列并绑定到指定交换机&#xff0c;来…

Spring 中的设计模式详解

“JDK 中用到了哪些设计模式? Spring 中用到了哪些设计模式? ”这两个问题&#xff0c;在面试中比较常见。 我在网上搜索了一下关于 Spring 中设计模式的讲解几乎都是千篇一律&#xff0c;而且大部分都年代久远。所以&#xff0c;花了几天时间自己总结了一下。 由于我的个人…

RNN心脏病预测

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 前期准备 1.数据导入 import pandas as pd from keras.optimizers import Adam from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split from sklearn.p…

Maven 父子模块的 pom.xml 文件编写

今天在写课内的实验作业的时候&#xff0c;三个内容要使用的依赖是一样的&#xff0c;于是想使用父子模块来玩玩。 父模块 pom.xml 书写 打包方式 <packaging>pom</packaging> 聚合子模块 <!-- 聚合子模块 --> <modules><module>../one</…

互联网协议(IP)中最常用的端口

80 端口和 443 端口是互联网协议&#xff08;IP&#xff09;中最常用的两个端口&#xff0c;分别用于 HTTP 和 HTTPS 通信。以下是它们的作用、区别以及相关背景信息&#xff1a; 80 端口和 443 端口的作用 80 端口&#xff1a; 用于 HTTP&#xff08;HyperText Transfer Prot…

AOT漫谈专题(第三篇): 如何获取C#程序的CPU利用率

一&#xff1a;背景 1. 讲故事 上篇聊到了如何对AOT程序进行轻量级的APM监控&#xff0c;有朋友问我如何获取AOT程序的CPU利用率&#xff0c;本来我觉得这是一个挺简单的问题&#xff0c;但一研究不是这么一回事&#xff0c;这篇我们简单的聊一聊。 二&#xff1a;如何获取C…