1.C 代码 6.2: 哈夫曼树
代码如下
#include#include #include using namespace std; #define MaxSize 1024 typedef struct wordcnt { char ch; int cnt=0; }Count; typedef struct NumCount { Count count[MaxSize]; int length=0; }NumCount; typedef struct HTree { char data; int weight; int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef struct HCode { char data; char* str; }*HuffmanCode; void ReadData(char *source); // 读入文件 void WordCount(char *data,NumCount *paraCnt); // 统计次数 void Show(NumCount *paraCnt); // 展示次数 void CreateHuffmanTree(HuffmanTree &HT,int length,NumCount cntarray); // 创建哈夫曼树 void select(HuffmanTree HT,int top,int *s1,int *s2); // 选择权重最小的两个节点 void CreateHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int length); // 创建哈夫曼编码 void Encode(char *data,HuffmanCode HC,int length); // 将读入的文件编码,写到txt文件 void Decode(HuffmanTree HT,int length); //读入编码文件,解码 int main(int argc, char** argv) { char data[MaxSize]; NumCount Cntarray; ReadData(data); // 读入数据 WordCount(data,&Cntarray); // 统计次数 Show(&Cntarray); //可以查看每个单词出现的对应次数 HuffmanTree tree; CreateHuffmanTree(tree,Cntarray.length,Cntarray); // 建树 HuffmanCode code; CreateHuffmanCode(tree,code,Cntarray.length); // 创建编码 Encode(data,code,Cntarray.length); // 生成编码文件 Decode(tree,Cntarray.length); // 解码 cout<<"请查看文件确认解码后的文件"< length;++j) { if(paraCnt->count[j].ch == data[i]) // 若已有记录,直接++ { ++paraCnt->count[j].cnt; flag = 1; break; } } if(!flag) // 没有记录,则新增 { paraCnt->count[paraCnt->length].ch = data[i]; paraCnt->count[paraCnt->length].cnt++; paraCnt->length++; } } } void Show(NumCount* paraCnt) { cout<<"the length is "< length< length;++i) { cout<<"The character "< count[i].ch<<" appears "< count[i].cnt<


