#include
#define Maxvalue 20
#define Maxleaf 15
#define Maxnode (2*Maxleaf-1)
using namespace std;
int n=0,len,j,m;
typedef struct{
int num; //存放字母的种类
char ch; //存放字母的个数
}inf;
inf info[Maxleaf]; //定义此类型数组,叶子信息leaf information
typedef struct{
int weight; //权值
int parent; //老豆
int lchild; //左孩子
int rchild; //右孩子
}HTnode;
HTnode Hofftree[Maxnode]; //定义此类型数组
typedef struct{
char cd[10]; //存储每个结点的哈夫曼编码
int start; //起始位置
}Hcode;
Hcode hcd[Maxleaf]; //定义此类型数组
void Count(){ //统计字符串中字母总个数以及各个字母的个数
int k,i;
char s[Maxvalue]; //定义串
printf("请输入字符串:\n");scanf("%s",&s); //输入字符串
len=strlen(s);printf("字符串字母的个数为:%d\n",len); //读出长度
info[0].ch=s[0]; //读取第一个字符
info[0].num=1; //并记录其字符出现次数为1
for(k=1;k<=len;k++){ //把整个字符串扫一遍
for(m=0;m<=n;m++) //n是当前已出现字符个数,info[n]是第n个出现字符的结构体,存种类与次数
if(info[m].ch==s[k]){ //枚举第M个已出现字符看与当前扫到的SK是否相同
++info[m].num; //s[k]与s[m]是同一个字母则num加1
break; //只要扫到与当前字符有重复就可以跳出(这样也算是剪枝吧)
}//解释上一行,例如dabaca,第一个a计数在下面三行+1,当k是3时SK是第二个a,当M=1扫到第一个A使num++后跳出,如果继续扫到M=5num++就会与当K=5时扫a重复
if(m>n){ //对当前sk如果在N+1个字符都没找到,说明有新的字母s[k]出现
info[++n].ch=s[k]; //存字符
info[n].num=1; //存次数
}
}
for(j=0;j