求助:C语言实现哈夫曼树编码与解码系统
作者:Triste夏木_668_365 | 来源:互联网 | 2024-11-15 19:59
最近遇到了一道关于哈夫曼树的编程题目,需要在下午之前完成。题目要求设计一个哈夫曼编码和解码系统,能够反复显示和处理多个项目,直到用户选择退出。希望各位大神能够提供帮助。
### 背景
最近遇到一道关于哈夫曼树的编程题目,需要在下午之前完成。题目要求设计一个哈夫曼编码和解码系统,能够反复显示和处理多个项目,直到用户选择退出。由于时间紧迫,希望各位大神能够提供帮助。
### 问题描述
设计一个利用哈夫曼算法的编码和译码系统,能够反复显示和处理多个项目,直到用户选择退出。
### 基本要求
1. 将权值数据存放在数据文件(文件名为`data.txt`,位于执行程序的当前目录中)。
2. 分别采用动态和静态存储结构。
3. 初始化:通过键盘输入字符集大小`n`、`n`个字符和`n`个权值,建立哈夫曼树。
4. 编码:利用建好的哈夫曼树生成哈夫曼编码。
5. 输出编码。
### 实现要求
- 使用VC6.0实现,做成一个控制台程序即可。
- 不能使用任何MFC扩展动态库,如STL或组件。
- 如果删除数据文件或破坏数据,程序应能检测出这种异常,不能崩溃。
### 代码示例
```c
#include
#include
#define MAX 21
struct Huffnode {
char data; /* 结点值 */
int weight; /* 权值 */
int parent; /* 父结点 */
int left; /* 左结点 */
int right; /* 右结点 */
};
struct Huffcode {
char cd[MAX];
int start;
};
Huffnode ht[2 * MAX];
Huffcode hcd[MAX], d;
int i, k, f, l, r, n, c, m1, m2;
char ch, *menu[] = {
"-------------构建哈夫曼树------------",
"1.----------添加字符和权值-----------",
"2.----------输出哈夫曼编码-----------",
"3.----------退出系统-----------------"
};
void Enter() {
printf("输入元素个数:");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
getchar();
printf("第%d个元素=>\n\t结点值:", i);
scanf("%c", &ht[i].data);
printf("\t权重:");
scanf("%d", &ht[i].weight);
}
for (i = 1; i <= 2 * n - 1; i++) {
ht[i].parent = ht[i].left = ht[i].right = 0;
}
for (i = n + 1; i <= 2 * n - 1; i++) { /* 构造哈夫曼树 */
m1 = m2 = 32767;
l = r = 0; /* l和r是最小权重的两个结点位置 */
for (k = 1; k <= i - 1; k++) {
if (ht[k].parent == 0) {
if (ht[k].weight 3);
return s;
}
void main() {
for (;;) {
switch (menu_select()) {
case 1: Enter(); break;
case 2: Display(); break;
case 3: exit(0);
}
}
}
```
### 问题讨论
1. **UP**
2. **UP**
3. 额。。。难道高手都在午休。。。惨了惨了
4. 这个时候来问作业题是否太晚了?
5. 没办法。。。刚才无聊开了下邮箱。。。就看到了,要是下午要的时候才看到更惨
6. just do it~~ 我的资源里有,用MFC做的,没使用扩展库! [链接](http://download.csdn.net/source/403519) 希望有所帮助!
7. 楼主........ 祝你好运了饿~~~~
8. **UP**
9. 我下下来看了,东西很好,但是能力有限,没搞懂。。。。
10. 汗~~有啥不懂?把里面的枝枝叶叶去掉,拿出来核心代码,放到控制台下,就行了!
11. 不能使用任何MFC扩展动态库,比如STL或者组件。 够bt
12. 就是让我们用单纯的C语言写好像。。。。刚找到一个挺简单的正在研究,如果能用,发上来大家共享下
13. 改天好好研究下你的代码,今天先随便找了个简单的改了改打发一下任务吧,一会研究下怎么把分给你 汗。。。。。。。。。顺便把代码粘上来分享吧,虽然很简单
14. 附上简单代码示例
15. 看不懂 能写详细点吗?
16. 附上另一个代码示例
推荐阅读
-
本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ...
[详细]
蜡笔小新 2024-12-27 11:26:39
-
学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ...
[详细]
蜡笔小新 2024-12-26 20:04:36
-
-
本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ...
[详细]
蜡笔小新 2024-12-28 09:46:23
-
本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ...
[详细]
蜡笔小新 2024-12-27 18:51:49
-
题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!----- ...
[详细]
蜡笔小新 2024-12-26 15:55:56
-
本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ...
[详细]
蜡笔小新 2024-12-26 13:59:07
-
Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ...
[详细]
蜡笔小新 2024-12-25 18:41:21
-
本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ...
[详细]
蜡笔小新 2024-12-25 18:27:21
-
本题涉及编号为1至n的火星商店,每个商店有一个永久商品价值v。操作包括每天在指定商店增加一个新商品,以及查询某段时间内某些商店中所有商品(含永久商品)与给定密码值的最大异或结果。通过线段树分治和持久化Trie树来高效解决此问题。 ...
[详细]
蜡笔小新 2024-12-27 21:23:11
-
题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ...
[详细]
蜡笔小新 2024-12-27 18:14:31
-
本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ...
[详细]
蜡笔小新 2024-12-27 13:55:14
-
本文探讨了如何在模运算下高效计算组合数C(n, m),并详细介绍了乘法逆元的应用。通过扩展欧几里得算法求解乘法逆元,从而实现除法取余的计算。 ...
[详细]
蜡笔小新 2024-12-26 21:41:44
-
本文详细探讨了文件描述符、文件句柄和打开文件之间的关系,通过具体示例解释了它们在操作系统中的作用及其相互影响。 ...
[详细]
蜡笔小新 2024-12-26 14:00:46
-
本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ...
[详细]
蜡笔小新 2024-12-26 12:24:25
-
本题涉及一棵由N个节点组成的树(共有N-1条边),初始时所有节点均为白色。题目要求处理两种操作:一是改变某个节点的颜色(从白变黑或从黑变白);二是查询从根节点到指定节点路径上的第一个黑色节点,若无则输出-1。 ...
[详细]
蜡笔小新 2024-12-26 10:22:20
-
Triste夏木_668_365
这个家伙很懒,什么也没留下!