📄 huffman.h
字号:
#ifndef _HUFFMAN_H_ //避免头文件被重复引用,即重复编译(编译器执行)
#define _HUFFMAN_H_
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<math.h>
//哈夫曼树的存储结构:用一个大小为2*N-1的向量来存储哈夫曼树中的结点(N个叶子结点需要合并N-1次)
int N; //叶子数目为N
int M; //树中结点总数M为2 * N - 1
#define N1 60 //叶子最大数目为N1
#define M1 2 * N1 - 1 //树中结点总数最大数目为M1
typedef char datatype;//结点的数据类型,可以根据需要改变
typedef struct { //结点类型
float weight; //权值
datatype data;
int lchild;
int rchild;
int parent; //左右孩子及双亲指针
}HTNode; //哈夫曼树的结点
typedef HTNode HuffmanTree[M1]; //HuffmanTree是向量类型
//定义一个数组后lchild,rchild,parent都为数组的下标号,范围为0 — M-1。
//字符集编码的存储结构:
typedef struct{
char ch; //存储字符
char bits[N1 + 1];//存放编码位串;字符集大小为N,故变长编码的长度不会超过N,加上一个结束符'\0',bits的大小应为N+1。
}CodeNode,EqualLengthCodeTable[N1]; //EqualLengthCodeTable为等长码表类型
typedef CodeNode HuffmanCodeTable[N1]; //HuffmanCodeTable为哈夫曼码表类型
//原始数据文件的字符频度表
typedef struct{
char data;
int sum; //文件中此字符的个数
float weight;
}CharacterSet,StrSetFrequencyTable[N1];
//栈的相关操作
#define StackSize 50 //假定预分配的栈空间最多为50个元素
typedef struct{
char data[StackSize];
int top;
}SeqStack;
//链表的相关操作
typedef struct linklist{
int data;
struct linklist* next;
}LinkListNode, *NodePtr; //链表结点及结点指针
//函数原型
void CreateHuffmanTree(HuffmanTree T,const char* const FILENAME);//构造哈夫曼树
void SetHuffmanEncodeTable(HuffmanTree T,HuffmanCodeTable H); //根据哈夫曼树T求哈夫曼编码表H
char HuffmanEncode(HuffmanCodeTable H,FILE* fp1,FILE* fp2);//对数据文件中的1个字符进行编码
char HuffmanDecode(HuffmanTree T,HuffmanCodeTable H,FILE* fp1,FILE* fp2);//对1个字符对应的编码序列进行译码
void InitHuffmanTree(HuffmanTree T); //将T初始化,T有M个结点,即T是有M个元素的数组
void InputWeightData(HuffmanTree T,const char* const FILENAME);
void SelectMin(HuffmanTree T,int i,int* p1,int* p2);
void FindChar(HuffmanCodeTable H,char ch,int* ptr_i);
void create_data_file(const char* const FILENAME); //创建一个原始数据文件
void characters_analysis(StrSetFrequencyTable F,const char* const FILENAME);
char ReadACharFromFile(FILE* fp1); //从文件fp1中读取一个字符并返回
void WriteStringsToFile(FILE* fp2,const char* const code);//把字符串code写入文件fp2保存
void WriteACharToFile(char ch1,FILE* fp2);//把字符ch1写入文件fp2保存
void print(const char* const FILENAME); //打印文件FILENAME的内容
void InputTwoFileName(char* const filename,char* const filename1,FILE* fp1,FILE* fp2);
void encrypt(FILE* fp1,FILE* fp2);
void decrypt(FILE* fp1,FILE* fp2);
void SetKeySequence(int* const key_sequence);
void free_linklist(NodePtr head);
char EqualLengthEncode(EqualLengthCodeTable E,FILE* fp1,FILE* fp2);
char EqualLengthDecode(EqualLengthCodeTable E,FILE* fp1,FILE* fp2);
void characters_analysis1(char* const string,const char* const filename);
void SetEqualLengthEncodeTable(EqualLengthCodeTable E,const char* const filename);
void FindChar1(EqualLengthCodeTable E,char ch,int* ptr_i);
void convert10to2(int i,char* const code,int length);
void InitStack(SeqStack *S); //初始化栈 //将顺序栈置空
int StackEmpty(SeqStack *S);//判栈空
void Push(SeqStack *S,char ch); //进栈
char Pop(SeqStack *S); //出栈
int StackFull(SeqStack *S); //判栈满
void DemonstrateHuffmanArithmetic(void);
void DemonstrateEqualLengthCodeArithmetic(void);
#endif //_HUFFMAN_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -