用类与对象C++编程

分为头文件Huffman.h

和主函数main.cpp两部分

(功能陆续添加)

类的声明:

class    Huffman
{
private:HNode*HTree;//哈夫曼树节点 HCode*HCodeTable;//存储编码表 int   N;//叶子节点数量 void code(int    i, string   newcode);//递归函数,对第i个节点编码
public:Huffman() {HTree = new  HNode;  HCodeTable = new   HCode;  N = 0;};void   CreateHTree(int a[], int    n, char name[]);//构建哈夫曼树void    CreateCodeTable();//创建编码表void   Encode(string   s, char *d);//编码 void   Decode(char *s, char    *d);//解码~Huffman();//析构函数 void  SelectMin(int   &x, int &y, int a, int  b);//辅助搜索最小值函数 void Printeach(int   retime);//打印每一个字母对应的编码
};//类的定义

两种结点的定义:

树中结点和编码中的结点:

struct   HNode
{int    weight;//结点权值int    parent;//双亲数组下标int  LChild;//左孩子数组下标    int RChild;//右孩子数组下标
};//每个结点的结构体 struct HCode
{char   data;//存储节点的内存 string   code;//存储结点对应的编码
};//记录每个节点的编码 

具体代码如下:

Huffman.h

#include<iostream>
#include<algorithm>
using   namespace   std;
#define manum   0x3f3f3f3f
struct  HNode
{int    weight;//结点权值int    parent;//双亲数组下标int  LChild;//左孩子数组下标    int RChild;//右孩子数组下标
};//每个结点的结构体 struct HCode
{char   data;//存储节点的内存 string   code;//存储结点对应的编码
};//记录每个节点的编码 class Huffman
{
private:HNode*HTree;//哈夫曼树节点 HCode*HCodeTable;//存储编码表 int   N;//叶子节点数量 void code(int    i, string   newcode);//递归函数,对第i个节点编码
public:Huffman() {HTree = new  HNode;  HCodeTable = new   HCode;  N = 0;};void   CreateHTree(int a[], int    n, char name[]);//构建哈夫曼树void    CreateCodeTable();//创建编码表void   Encode(string   s, char *d,int &contro);//编码 void   Decode(char *s, char    *d);//解码~Huffman();//析构函数 void  SelectMin(int   &x, int &y, int a, int  b);//辅助搜索最小值函数 void Printeach(int   retime);//打印每一个字母对应的编码
};//类的定义/****************************类的成员函数的实现*/
//辅助函数,搜索数列中最小的两个结点值void Huffman::SelectMin(int  &x, int &y, int a, int  b)
{//cout << a << " " << b << endl;//cout << HTree[b - 1].weight << endl;int    m = manum, n = manum;//最小的两个数 for (int i = a; i < b; i++){if (HTree[i].weight < m){m = HTree[i].weight;x = i;}}for (int i = a; i < b; i++){if (HTree[i].weight < n&&i!=x){n = HTree[i].weight;y = i;}}
}//构造哈夫曼树
//a[]存储每种字符的权值,n为字符的种类,name为各个字符的内容
void    Huffman::CreateHTree(int    a[], int    n, char name[])
{N = n;HCodeTable = new   HCode[N];HTree = new   HNode[2 * N - 1];//2*n-1为总结点个数for (int i = 0; i < N; i++){HTree[i].weight = a[i];HTree[i].LChild = HTree[i].RChild = HTree[i].parent = -1;HCodeTable[i].data = name[i];}int  x, y;for (int i = n; i < 2 * N - 1; i++)//开始构建哈夫曼树{SelectMin(x, y, 0, i);//从1~i中选出两个权值最小的结点//cout << "x=" << x <<" "<<HTree[x].weight<<endl;//cout << "y=" << y <<" "<<HTree[y].weight<<endl;HTree[x].parent = HTree[y].parent = i;HTree[i].weight = HTree[x].weight + HTree[y].weight;HTree[i].LChild = x;HTree[i].RChild = y;HTree[i].parent = -1;HTree[x].weight = HTree[y].weight = manum;}
}//生成哈夫曼对应编码
void    Huffman::code(int   i, string   newcode)
{if (HTree[i].LChild == -1){HCodeTable[i].code = newcode;return;}code(HTree[i].LChild, newcode + '0');code(HTree[i].RChild, newcode + '1');
}
void    Huffman::CreateCodeTable()//生成编码表
{code(2 * N - 2, "");
}//进行编码
void    Huffman::Encode(string  s, char     *d,int &contro)
{contro = 0;int    n2 = 0;//控制s的变量 while (s[n2] != '\0'){for (int i = 0; i < N; i++){if (HCodeTable[i].data == s[n2]){int  k = 0;while (HCodeTable[i].code[k] != '\0')k++;//统计此字符对应编码的长度for (int j = 0; j < k; j++){*d = HCodeTable[i].code[j];d++;contro++;}}}n2++;}
}//进行解码
void    Huffman::Decode(char    *s, char    *d)
{while (*s != '\0'){int  parent = 2 * N - 2;//根结点在HTree的下标(有改动,原书中为2*n-2)while (HTree[parent].LChild != -1)//如果叶子结点不是根结点 {if (*s == '0')parent = HTree[parent].LChild;elseparent = HTree[parent].RChild;s++;}*d = HCodeTable[parent].data;d++;}
}//打印函数,打印每一个字符的编码
void    Huffman::Printeach(int  retime)
{cout << "每一个字符对应的编码如下:" << endl;for (int i = 0; i < retime; i++){cout << "i=" << i << " " << HCodeTable[i].data << " " << HCodeTable[i].code << endl;}
}//析构函数
Huffman::~Huffman()
{N = 0;HTree = NULL;HCodeTable = NULL;
}//5.16更新,修改vs上出现字符错乱的bug

main.cpp

#include<iostream>
#include<cstring>
#include<string>
#include"Huffman.h"
using   namespace   std;
#define Size    100
string  str;
char    name[60];//字符类型(0-25为大写,30-55为小写,26为下划线)
int     Time[60];//字符的权值
char    name2[60];
int     Time2[60];
int main()
{cout << "请输入你想传递的字符串(空格用下划线代替),如想结束程序,请输入(END)" << endl;while (cin >> str){if (str == "END")break;memset(Time, 0, sizeof(Time));memset(Time2, 0, sizeof(Time2));int len = str.size();if (len > Size){cout << "数据量超过可处理范围" << endl;cout << "请输入你想传递的字符串(空格用下划线代替),如想结束程序,请输入(END)" << endl;continue;}for (int i = 0; i < len; i++){if (str[i] == '_'){Time[26]++;name[26] = '_';}if (str[i] >= 'A'&&str[i] <= 'Z'){Time[str[i] - 'A']++;name[str[i] - 'A'] = str[i];}if (str[i] >= 'a'&&str[i] <= 'z'){Time[str[i] - 'a' + 30]++;name[str[i] - 'a' + 30] = str[i];}}//录入并处理字符串 int retime = 0;//实际上出现的字符个数 for (int i = 0; i < 60; i++){if (Time[i] != 0){name2[retime] = name[i];Time2[retime] = Time[i];retime++;}}//cout << "retime=" << retime << endl;name2[retime] = '\0';//精细化两个数组//运用类完成功能 Huffman Huf;//cout << retime << endl;Huf.CreateHTree(Time2, retime, name2);Huf.CreateCodeTable();           //树和表的建立 Huf.Printeach(retime);//打印每一个字符对应的哈夫曼编码 char   *ar = new  char[Size];//编码后的字符串char    *br = new  char[Size];//解码后的字符串int contro=0;Huf.Encode(str, ar,contro);cout << "编码结果如下:" << endl;for (int i = 0; i < contro; i++)cout << *(ar + i);cout << endl;//cout << ar << endl;cout << "解码结果如下:" << endl;Huf.Decode(ar, br);for (int i = 0; i < len; i++)cout << *(br + i) ;cout << endl;cout << "定长编码需要的长度是:" << len*5 << ";" << "哈夫曼编码的长度是:" << contro << endl;cout << "原编码是新编码的" << len * 5 * 1.0 / contro <<"倍"<< endl;Huf.~Huffman();cout << endl;cout << "请输入你想传递的字符串(空格用下划线代替),如想结束程序,请输入(END)" << endl;}
}

北邮数据结构:哈夫曼树相关推荐

  1. 数据结构---哈夫曼树

    数据结构-哈夫曼树 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> #define N 100 #define INF ...

  2. 【数据结构——哈夫曼树及其应用】

    [数据结构--哈夫曼树及其应用] 一.哈夫曼树的基本概念 二.哈夫曼树的构造算法 (一)哈夫曼树的构造过程 (二)哈夫曼树构造算法的实现 1.初始化 2.创建树 3.完整的创建哈夫曼树代码 三.哈夫曼 ...

  3. 数据结构哈夫曼树实现26个英文字符的编码和译码

    数据结构哈夫曼树实现26英文字符的编码和译码 那么首先什么是哈夫曼树?(知道的略过,直奔下面代码就好!) 在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编 ...

  4. 数据结构--赫夫曼树

    数据结构 –赫夫曼树 文章目录 数据结构 一.一些概念 二.最优二叉树(赫夫曼树) 三.赫夫曼树的构造 四.赫夫曼编码 五.前缀编码 一.一些概念 路径:从树中一个结点到另一个结点之间的分支构成这两个 ...

  5. 数据结构(哈夫曼树,哈夫曼编码)入门篇,JAVA实现

    什么是哈夫曼树 哈夫曼树就是一种最优判定树,举个例子,如下一个判断逻辑 if(s<60) g=1; else if(s<70) g=2 else if(s<80) g=3 else ...

  6. 数据结构 - 赫夫曼树

    wpl最小的就是赫夫曼树(所有叶子节点的带权路径长度之和最小) 写出来两个节点连接,然后循环就可以了 package tree.huffmantree;import java.util.ArrayLi ...

  7. 数据结构--赫夫曼树及其应用

    讲解请参考 赫夫曼 ------ 赫夫曼树和赫夫曼编码的存储表示------ typedef struct {unsigned int weight;unsigned int parent,lchil ...

  8. 数据结构哈夫曼树(C语言版)

    文章目录 一. 问题 需求分析 代码分析 结构体定义使用 建立哈夫曼树,首先需要找到两个权值最小的两个叶子结点,然后建树 哈夫曼编码(我采用的是从叶子结点-->根节点,所以实际是反过来的) 使用 ...

  9. 数据结构——哈夫曼树

    1.介绍 哈夫曼树就是树的带权路径长度(即WPL)最小的树,WPL等于所有叶节点的带权路径长度之和. 而叶节点的带权路径长度=该结点的路径长度*该结点的权值. 结点的路径长度就是从根节点到该结点所经历 ...

  10. 算法与数据结构 --- 哈夫曼树及其应用

    第一部分 --- 哈夫曼树的基本概念 对一个判断树的判断次序进行改变后判断的总次数就可能截然不同 如上图,在面对一万个数据的时候,左边的判断树的判断总次数为22000次,右边的判断树的判断总次数为31 ...

最新文章

  1. 植物MWAS研究—小米产量与微生物组关联分析
  2. 见鬼了,VS2005发布站点不会把Global.asax复上。
  3. 数组黑科技(偏性能方面)未完待更新...
  4. c#参数修饰符-params
  5. jQuery动画:实现渐入渐出
  6. python电影推荐系统 github_GitHub - qingtang3009/MovieRecommend: 一个电影推荐系统
  7. 中国象棋ai人工智能(网页版)
  8. AgentWeb 更加简洁优秀的webview
  9. win7 旗舰版 秘钥 联网激活
  10. 学tlc和JAVA,#Java学习之路——第一部分总结
  11. 四种形态图解_波浪理论:调整浪的四种形态(图解)
  12. python电商_电商数据分析(python)
  13. 在线直播|是事实还是贩卖焦虑?IT行业也偏爱“小鲜肉”
  14. 使用旋转动画实现刻度表
  15. 基于LLVM编译器的IDA自动结构体分析插件
  16. (十八)自动装配-@Autowired-构造器,参数,方法,属性
  17. Aria2高速下载利器 带你冲破百度网盘重重束缚
  18. Maven引入依赖后自动下载并关联源码 Source
  19. 《想象的共同体》本尼德克特安德森 epub+mobi+azw3
  20. 小米移动3G版本,救砖手册,移动叔叔

热门文章

  1. linux脚本的数据输出到excel,将CSV数据输出到EXCEL
  2. 使用EXCEL制作核酸检测结果异常人员活动轨迹地图
  3. WPF ListBox
  4. AP微积分FRQ例题解析
  5. 大气严谨学术汇报PPT模板
  6. SAP S4 HANA 年结汇总数据
  7. 微信转盘抽奖前端源码(三):移动端浏览器兼容性(12个奖品,指针开始时指向奖品)
  8. 用C/C++打造电脑微信多开神器,值得体验一把!
  9. 我用Python制作整蛊软件发送给女友,结果.......我单身了!!
  10. 驰骋BPM-新增功能发布-签批组件