数据结构实验报告的主题聚焦于文件压缩,具体使用了哈夫曼编码这一数据压缩技术。哈夫曼编码是一种基于频率的编码方法,适用于无损数据压缩,尤其在文本文件压缩中非常有效。它通过构建哈夫曼树来实现,其中字符出现的频率作为权重,频繁出现的字符将被赋予较短的编码,反之则赋予较长的编码,从而在整体上减少文件的大小。
在实验设计中,首先需要统计待压缩文本文件中每个字符的出现频率。这可以通过遍历整个文件,统计每个字符出现的次数来完成。在这个过程中,可以使用结构体数组`LeafNode`来存储每个字符及其对应的频率,同时记录字符的二进制码长度。例如:
```c
typedef struct Node{
int weight; // 叶子结点的权值,即字符频率
char c; // 叶子结点代表的字符
int num; // 叶子结点的二进制码的长度
}LeafNode[N];
```
然后,使用这些频率来构造哈夫曼树。哈夫曼树是一种特殊的二叉树,没有度为1的节点,由频率最低的两个节点合并生成新的节点,直至所有节点合并成一个单一的根节点。这个过程可以迭代或递归地进行。在实验中,可以使用如下的结构体数组`HTNode`来存储哈夫曼树的节点:
```c
typedef struct{
unsigned int weight;// 权值
unsigned int parent, LChild, RChild; // 父节点和左右子节点
}HTNode,Huffman[M+1]; //huffman树
```
哈夫曼树构建完成后,根据树结构为每个字符生成哈夫曼编码,并将这些编码存储到`HufCode.txt`文件中。通常,可以使用栈或者队列辅助进行编码过程,从根节点到每个叶子节点的路径就是该叶子节点的哈夫曼编码。
接下来是文件的压缩过程,根据生成的哈夫曼编码,遍历原始文件,将每个字符替换为其哈夫曼编码,生成压缩后的文件`CodeFile.dat`。
解压时,需要读取哈夫曼树(保存在`HufTree.dat`文件中)和哈夫曼编码表,然后反向进行编码过程,将编码还原为原始字符,从而实现解压缩。
实验中涉及到的主要算法包括:
1. 读取文件:通过`fread`函数读取整个文件到内存中。
2. 统计字符频率:遍历字符串,检查重复字符并计算频率,存储在`LeafNode`结构体中。
3. 创建哈夫曼树:使用频率数据构建哈夫曼树,可以使用贪心策略,每次选择两个最小的节点合并。
4. 生成哈夫曼编码:根据哈夫曼树,从根节点到叶子节点的路径表示编码。
5. 文件压缩:遍历原始文件,用哈夫曼编码替换字符,写入压缩文件。
6. 文件解压缩:读取哈夫曼树和编码表,根据编码解码压缩文件,恢复原始内容。
这个实验综合运用了数据结构(特别是二叉树)和算法(如哈夫曼编码、文件操作),展示了如何在实际应用中利用这些理论知识解决实际问题。通过这个实验,学生可以深入理解数据压缩的基本原理,提升编程实践能力。