当前位置: 首页 > news >正文

c语言实现哈夫曼编码

要实现哈夫曼编码,需要以下步骤:

  1. 统计字符出现的频率
  2. 构建哈夫曼树
  3. 遍历哈夫曼树,给不同的字符赋予不同的编码
  4. 将编码后的字符写入文件中

下面是一个简单的 C 语言实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_TREE_HT 100// 节点结构体
struct MinHeapNode {char data; // 字符unsigned freq; // 频率struct MinHeapNode *left, *right; // 左右子节点
};// 哈夫曼树结构体
struct MinHeap {unsigned size; // 大小unsigned capacity; // 容量struct MinHeapNode** array; // 数组
};// 创建节点
struct MinHeapNode* newNode(char data, unsigned freq) {struct MinHeapNode* temp = (struct MinHeapNode*) malloc(sizeof(struct MinHeapNode));temp->left = temp->right = NULL;temp->data = data;temp->freq = freq;return temp;
}// 创建一个大小为 capacity 的空的 MinHeap
struct MinHeap* createMinHeap(unsigned capacity) {struct MinHeap* minHeap = (struct MinHeap*) malloc(sizeof(struct MinHeap));minHeap->size = 0; // 初始化大小为 0minHeap->capacity = capacity;minHeap->array = (struct MinHeapNode**)malloc(minHeap->capacity * sizeof(struct MinHeapNode));return minHeap;
}// 交换 *a 和 *b 的值
void swapMinHeapNode(struct MinHeapNode** a, struct MinHeapNode** b) {struct MinHeapNode* temp = *a;*a = *b;*b = temp;
}// 维护最小堆的特性
void minHeapify(struct MinHeap* minHeap, int idx) {int smallest = idx;int left = 2 * idx + 1;int right = 2 * idx + 2;if (left < minHeap->size && minHeap->array[left]->freq < minHeap->array[smallest]->freq)smallest = left;if (right < minHeap->size && minHeap->array[right]->freq < minHeap->array[smallest]->freq)smallest = right;if (smallest != idx) {swapMinHeapNode(&minHeap->array[smallest], &minHeap->array[idx]);minHeapify(minHeap, smallest);}
}// 检查大小为 1 的最小堆
int isSizeOne(struct MinHeap* minHeap) {return (minHeap->size == 1);
}// 从 MinHeap 中取出最小的节点 (最小堆的根)
struct MinHeapNode* extractMin(struct MinHeap* minHeap) {struct MinHeapNode* temp = minHeap->array[0];minHeap->array[0] = minHeap->array[minHeap->size - 1];--minHeap->size;minHeapify(minHeap, 0);return temp;
}// 插入新的节点到 MinHeap 中
void insertMinHeap(struct MinHeap* minHeap, struct MinHeapNode* minHeapNode) {++minHeap->size;int i = minHeap->size - 1;while (i && minHeapNode->freq < minHeap->array[(i - 1) / 2]->freq) {minHeap->array[i] = minHeap->array[(i - 1) / 2];i = (i - 1) / 2;}minHeap->array[i] = minHeapNode;
}// 判断当前节点是否是叶子节点
int isLeaf(struct MinHeapNode* root) {return !(root->left) && !(root->right);
}// 创建并构建哈夫曼树
struct MinHeapNode* buildHuffmanTree(char data[], int freq[], int size) {struct MinHeapNode *left, *right, *top;// 创建一个最小堆,并初始化大小struct MinHeap* minHeap = createMinHeap(size);for (int i = 0; i < size; ++i)minHeap->array[i] = newNode(data[i], freq[i]);minHeap->size
http://www.lryc.cn/news/225916.html

相关文章:

  • Vuex:模块化Module :VCA模式
  • 【uni-app + uView】CountryCodePicker 国家区号组件
  • 思科对路由器的配置
  • 实战Leetcode(三)
  • 【PTE-day05 宽字节注入】
  • 计算机网络期末复习-Part3
  • docker在虚拟机中的应用
  • 小程序样式淡入淡出效果
  • 虚幻5 删除C盘缓存及修改缓存路径
  • 手写C++ 实现链表的反转、删除、合并
  • 虚幻C++基础 day4
  • 【Vue】【uni-app】工单管理页面实现
  • 【系统架构设计】架构核心知识: 2.1 软件过程模型
  • 数据管理系统-week1-文件系统、数据库和数据库管理系统
  • 探索OpenCV中直方图的神奇之处:应用与实现
  • MapReduce编程——矩阵乘法(Python版本)
  • nature日报:为什么印度德里现在的空气污染如此严重?
  • ChatGPT、GPT-4 Turbo接口调用
  • IDEA中常用的调试快捷键
  • 需要设计易清洗的口琴
  • 贝锐蒲公英智慧运维方案:实现远程网络监控、管理、维护工业设备
  • Intel oneAPI笔记(4)--jupyter官方文档(Unified Shared Memory)学习笔记
  • dRep-基因组质控、去冗余及物种界定
  • 截图贴图软件推荐 - 附下载链接 | Snipaste | Steuna
  • python调用chrome实现网页自动操作
  • FFMPEG库实现mp4/flv文件(H264+AAC)的封装与分离
  • 《红蓝攻防对抗实战》九.内网穿透之利用GRE协议进行隧道穿透
  • 大数据毕业设计选题推荐-智慧消防大数据平台-Hadoop-Spark-Hive
  • LeetCode 面试题 16.20. T9键盘
  • systemctl enable docker.service报错“Failed to execute operation: Bad message“