任务简述
对一篇英文文章,统计其中26个小写字母出现的频次,对这些小写字母进行Huffman编码。
算法描述
用hf【51】来存放51个结点。先输出文本并用count数组记录每个字母出现次数。对hf初始化,然后每次将weight最小的两个结点组成一个新的结点,直到生成了51个结点。对每个字母对应的bianma赋值,先求出bianma长度然后倒序赋值,左孩子赋0,右孩子赋1。输出每个字母输出的次数及对应的编码。最后用“shuru.txt”输入编码,一一判断是否是某个字母对应的编码,分别操作,输出文本。时间复杂度为O(n)(n为文本长度)
源代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node{
int weight,pa,left,right;//weight为出现次数
char ch,bianma[25];//ch为每个结点对应的字母,bianma记录每个字母对应的bianma
}HF;
int zhuanhua(char ch){
//将字符转化为数字
int a=ch-'a';
return a;
}
int main(){
FILE *f=fopen("A.txt","r");//A.txt为原文
char ch,bianma[25];//ch是每次输入的
HF hf[51];//共26个字母,霍夫曼树共51个结点
int count[26]={
0},i,visit[51]={
0},n=26,mmin,mmmin,j,k,length;//count记录每个字母出现次数,visit在生成树时记录每个字母是否已有pa,n为当前结点数量,mmin是每次循环最小数 mmmin是第二小数,length是每个字母的bianma长度
if(!f){
//打开失败
printf("打开失败\n");
exit(0);
}
printf("原文本:\n&#