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

📄 huffmancoder.h.bak

📁 有关huffman的程序对大家学习数据结构有好处但不是所有人都用得上
💻 BAK
字号:
// HuffmanCoder.h: interface for the HuffmanCoder class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_HUFFMANCODER_H__863AA455_C764_4D14_ACFE_B38020E94836__INCLUDED_)
#define AFX_HUFFMANCODER_H__863AA455_C764_4D14_ACFE_B38020E94836__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "ProgressListener.h"
#include "WinLog.h"

#include <list>

#include "SLinkTree.h"

#define HUFFY_LITTLEENDIAN 1

class HuffmanCoder  
{
public:
	HuffmanCoder();
	virtual ~HuffmanCoder();

	void SetUIHelpers(ProgressListener *NewListener, WinLog *NewLogTarget);

	void SetInFile(const char *NewInFN);
	void SetOutFile(const char *NewOutFN);

	unsigned int Encode();
	unsigned int Decode();

	static unsigned int ThreadEncoder(void *CoderPtr);
	static unsigned int ThreadDecoder(void *CoderPtr);
	
private:
	ProgressListener *MyListener;
	WinLog *MyLog;

	char *InFileName,*OutFileName;

	struct HNode
	{
		unsigned int Weight;
		unsigned char Symbol;
	};

	struct HTEntry
	{
		unsigned int Code;
		unsigned char CodeLen;

		HTEntry() { Code=0; CodeLen=0; }
	};


	struct TTEntry
	{
		unsigned char OutSymbolCount;
		unsigned char *OutSymbolA;
		unsigned char NextNodeName;

		TTEntry() { OutSymbolCount=0; OutSymbolA=NULL; }
	};

	//Decoder helpers
	void ReadHTable(FILE *SourceFile, HTEntry *OutTable);
	void WriteDecodedFile(FILE *InFile, FILE *OutFile, TTEntry *TransTable);

	unsigned char BuildHuffTree(HTEntry *SourceTable, HNode *TargetRoot);
	unsigned char BuildHuffTreeInternal(unsigned char CurrName, unsigned char CurrSymbol, HTEntry *SourceEntry, HNode *TargetNode);

	void BuildTTable(HNode *SourceNode, unsigned char NameCount, TTEntry *OutTable);
	void FillTTEntry(HNode *RootNode, HNode *StartNode, unsigned char EncodedByte, TTEntry *OutEntry);
	HNode * LookupInternalNode(HNode *RootNode, unsigned char NodeName);

	//Encoder helpers
	void WriteHTable(FILE *OutFile, HTEntry *CodeTable);
	void WriteCodedFile(FILE *InFile, unsigned int StreamLen, FILE *OutFile, HTEntry *CodeTable);

	void PrintTableStats(HTEntry *SourceTable, HNode *FreqA, WinLog *OutLog);

	void FillFreqA(FILE *InFile, unsigned int *FreqA);
	SLinkTree<HNode>::iterator BuildHuffTree(unsigned int *FreqA, SLinkTree<HNode> **OutTree);
	/*OutTable is a full-length(MaxSymbolCount), direct
	access lookup table.*/
	void BuildHuffTable(HNode *HTreeRoot, HTEntry *OutTable);
	void BuildTableInternal(HNode *HTreeRoot, unsigned int CurrCode, unsigned char CurrCodeLen, HTEntry *OutTable);

	void OrderedInsert(std::list<HNode *> &TargetList, HNode *NewNode);

	//General helpers
	FILE *Loggedfopen(const char *FName, const char *Mode);
};

#endif // !defined(AFX_HUFFMANCODER_H__863AA455_C764_4D14_ACFE_B38020E94836__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -