admin管理员组

文章数量:1639678

目录

(一)第一步就是思路整理

(二)函数模块

(三)主要数据类型与变量

1、定义哈夫曼树的结构

2、动态分配数组存储赫夫曼编码表

3、存储数据扫描统计结果

4、主要变量

(四)代码测试

1、方案

建三个文件

2、运行结果

压缩文件

解压文件

输出文件

比较文件

(五)源码部分


背景知识:二叉树的应用、赫夫曼树。

目的要求:掌握赫夫曼树和赫夫曼编码的基本思想和算法的程序实现。

实验内容:实现文件中数据的加解密与压缩:将硬盘上的一个文本文件进行加密,比较加密文件和原始文件的大小差别;对加密文件进行解密,比较原始文件和解码文件的内容是否一致。

实验说明:

1.输入和输出:

(1)输入:硬盘上给定的原始文件及文件路径。

(2)输出:

  • 硬盘上的加密文件及文件路径;
  • 硬盘上的解码文件及文件路径;
  • 原始文件和解码文件的比对结果。

2.实验要求:

  • 提取原始文件中的数据(包括中文、英文或其他字符),根据数据出现的频率为权重,构建Huffman编码表;
  • 根据Huffman编码表对原始文件进行加密,得到加密文件并保存到硬盘上;
  • 将加密文件进行解密,得到解码文件并保存点硬盘上;
  • 比对原始文件和解码文件的一致性,得出是否一致的结论。

3.参考类型定义   //双亲孩子表示法      

        typedef struct {

            unsigned int  weight;

            unsigned int  parent, lchild, rchild;

        } HTNode, *HuffmanTree;      //动态分配数组存储赫夫曼树

  • typedef char * * HuffmanCode;  //动态分配数组存储赫夫曼编码表

    (*≧︶≦))( ̄▽ ̄* )ゞ小唠叨

 

这是我们的数据结构实验二,作为拖延症患者的我ddl从来都是第一生产力,于是,熬了两个晚上终于把思路给理出来了。8过代码还是借鉴啦大佬的博客

https://blog.csdn/qq_43492703/article/details/99769317?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-4


 

(一)第一步就是思路整理

这个实验难在它对我来说有一些抽象,一开始对文件的压缩和解压的概念很模糊,后来找到了B站上的一个视频(https://www.bilibili/video/BV1Yt411Y76w?from=search&seid=11711631498115172127),把这个本来对我来说比较抽象的概念具体化了:假设文件中的内容是“abcdabccccca”12个字符,一个ascii码对应一个字节,那么就是12个字节。但是如果用少于1个字节的几个位来表示各个字符,列如a:10,c:11,b:01,c:00,那么算下来只需要不到12个字节(5-6个字节)就可以搞定。而每个字符的编码可以由哈夫曼编码得到,每个字符的权值就是它出现的频率。

实验中比较重要的两个步骤就是压缩和解压缩:

①压缩:先打开要压缩的文件,分析每个字符的总次数,然后将次数传给哈夫曼树,构建一颗哈夫曼树,然后获取到每个字符的哈夫曼编码,将编码写入文件

②解压缩:打开要解压缩的文件,读出储存的哈夫曼字典(结构体),然后根据字典逐个的翻译编码得到字符,写入文件。

哈夫曼编码的思路(来自上述链接中大佬的博客):

1、读取文件并存储到vector容器中

2、将vector容器中的数据按照以下TNode结构存储

typedef struct {/*存储数据扫描统计结果*/

    char* data;/*表示文件中的字符*/

    int* cou;/*同一个字符在文件中出现的次数*/

    int length;/*文件的字符总长度*/

}TNode;

本文标签: 文件加解密数据赫夫曼