C语言实现图像压缩编码:基于哈夫曼算法,可在Dev中运行
这是一个简单的图像压缩编码算法的C语言实现,使用了哈夫曼编码进行压缩。以下是代码示例: ```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; } struct MinHeap *createMinHeap(unsigned capacity) { struct MinHeap *minHeap = (struct MinHeap *)malloc(sizeof(struct MinHeap)); minHeap->size = 0; minHeap->capacity = capacity; minHeap->array = (struct MinHeapNode )malloc(minHeap->capacity * sizeof(struct MinHeapNode *)); return minHeap; } void swapMinHeapNode(struct MinHeapNode a, struct MinHeapNode b) { struct MinHeapNode *t = *a; *a = *b; *b = t; } 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); } } int isSizeOne(struct MinHeap *minHeap) { return (minHeap->size == 1); } 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; } 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; } void buildMinHeap(struct MinHeap *minHeap) { int n = minHeap->size - 1; int i; for (i = (n - 1) / 2; i >= 0; --i) minHeapify(minHeap, i); } void printArr(int arr[], int n) { int i; for (i = 0; i < n; ++i) printf("%d", arr[i]); printf("\n"); } int isLeaf(struct MinHeapNode *root) { return !(root->left) && !(root->right); } struct MinHeap *createAndBuildMinHeap(char data[], int freq[], int size) { struct MinHeap *minHeap = createMinHeap(size); for (int i = 0; i < size; ++i) minHeap->array[i] = newNode(data[i], freq[i]); minHeap->size = size; buildMinHeap(minHeap); return minHeap; } struct MinHeapNode *buildHuffmanTree(char data[], int freq[], int size) { struct MinHeapNode *left, *right, *top; struct MinHeap *minHeap = createAndBuildMinHeap(data, freq, size); while (!isSizeOne(minHeap)) { left = extractMin(minHeap); right = extractMin(minHeap); top = newNode('$', left->freq + right->freq); top->left = left; top->right = right; insertMinHeap(minHeap, top); } return extractMin(minHeap); } void printCodes(struct MinHeapNode *root, int arr[], int top) { if (root->left) { arr[top] = 0; printCodes(root->left, arr, top + 1); } if (root->right) { arr[top] = 1; printCodes(root->right, arr, top + 1); } if (isLeaf(root)) { printf("%c: ", root->data); printArr(arr, top); } } void HuffmanCodes(char data[], int freq[], int size) { struct MinHeapNode *root = buildHuffmanTree(data, freq, size); int arr[MAX_TREE_HT], top = 0; printCodes(root, arr, top); } int main() { char data[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; int freq[] = { 5, 9, 12, 13, 16, 45 }; int size = sizeof(data) / sizeof(data[0]); printf("Huffman Codes:\n"); HuffmanCodes(data, freq, size); return 0; } ``` 这个代码实现了一个简单的Huffman编码算法,可以用来对图像进行压缩编码。您可以根据需要调整输入数据和频率来测试不同的情况。希望对您有帮助! ######[AI写代码神器 | 2946点数解答 | 2024-12-17 10:28:47]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)380
- Java 利用 Apache Commons Imaging 压缩 PNG 图片至指定大小,附代码及注意事项(阿里通义 | 524点数解答 | 2024-02-27 13:54:15)308
- 哈夫曼编码:基于字符频率实现(0,1)编码及Python代码详解(讯飞星火 | 794点数解答 | 2024-06-19 23:42:13)251
- Python实现多个整数相乘的计算及开发建议(字节豆包 | 427点数解答 | 2026-02-25 19:25:10)45
- 编程求解 1 到 N 的阶乘和:Python 与 C++ 实现(字节豆包 | 650点数解答 | 2026-03-01 20:05:48)26
- C++实现自定义函数计算 f(a)+f(b)+f(c)(字节豆包 | 610点数解答 | 2026-04-11 20:22:28)22
- C++实现找出指定范围内完全数的方法及开发建议(字节豆包 | 692点数解答 | 2026-04-11 20:23:34)20
- C++ 计算 1 到 n 中数字 1 的出现次数的实现与解析(字节豆包 | 849点数解答 | 2026-04-11 20:24:18)25
- C++ 实现:从大整数中删数求最小密码的巧妙算法(DeepSeek | 473点数解答 | 2025-06-20 16:08:21)213
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)350
- Python 脚本提取文本中 2048 开头部分,兼顾异常处理与多匹配情况(字节豆包 | 212点数解答 | 2024-12-05 02:33:53)191
- Python脚本:从复杂字符串精准提取IPv6地址特定部分及注意要点(阿里通义 | 320点数解答 | 2024-12-05 02:35:04)192