⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huffman.h

📁 自己用C编写的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 + -