3树-4哈夫曼树

#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

你可能感兴趣的:(考研计机)