huffman编码要求:建立一个
用win-tc编译通过
-----------------------------------------------------------
/*
* 程序功能:对文本文件success。 dat进行霍夫曼编码,用文本文件coding。dat保存编码
* 编程思路:
第一步:
首先打开扫描文件success。dat,统计出每个字符出现的次数,作为各个字符的权,
在这里我假设文本文件里面的字符只包含a~z这26个小写字母,用CharCount函数扫描文件,统计
出各个字符在文件中出现的次数(注意,如果某个字符一个都没出现,那就设它的权为1,因为权
是0的话将不能正确编码,血的教训) Ch...全部
用win-tc编译通过
-----------------------------------------------------------
/*
* 程序功能:对文本文件success。
dat进行霍夫曼编码,用文本文件coding。dat保存编码
* 编程思路:
第一步:
首先打开扫描文件success。dat,统计出每个字符出现的次数,作为各个字符的权,
在这里我假设文本文件里面的字符只包含a~z这26个小写字母,用CharCount函数扫描文件,统计
出各个字符在文件中出现的次数(注意,如果某个字符一个都没出现,那就设它的权为1,因为权
是0的话将不能正确编码,血的教训) CharCount函数的原型如下:
void CharCount(FILE *fp, int *Count, int length);
其中fp是要扫描的文件的指针,数组Count的每个元素分别用来统计a,b。
。z在文件中出现的次数,
length是数组的长度。
第二步:
根据给定的字符集(这里设字符集为a~z这26个小写字母), 和各字符的权(用CharCount函数得到
的),
创建哈夫曼树,函数原型如下:
void createHTree(HuffmanTree HT, char *c, int *w, int n);
其中数组c[0。
。n-1]就是要编码的字符集,w[0。。n-1]就是Count函数得到的各字符的权,构造霍夫曼树
HT
第三步:
对霍夫曼树中的n个叶子结点进行编码,第i个叶子结点的编码存放在HC[i]中(1
#include
#include
#define MAXLEAFNUM 50 /* 叶子结点的最大数目 */
/* 定义一个霍夫曼树的结构 */
typedef struct node
{
char ch; /* 当前结点表示的字符,对于非叶子结点,此域不用 */
int weight; /* 当前结点的权值 */
int parent; /* 当前结点的父结点下标,为0表示无父结点 */
int lchild, rchild; /* 当前结点左右孩子结点的下标,都为0时表示无孩子结点 */
} HuffmanTree[2*MAXLEAFNUM];
typedef char* HuffmanCode[MAXLEAFNUM+1];
/* 在HT[1~n]中选择weigth最小的且parent为0的结点,用p1,p2带回 */
void select(HuffmanTree HT, int n, int *p1, int *p2);
/* 根据给定的字符集创建哈夫曼树 */
void createHTree(HuffmanTree HT, char *c, int *w, int n);
/* n个叶子结点在霍夫曼树HT中的下标为1~n,第i(i n)
return;
}
/* 将ch代表的字符的编码写入到输出文件 */
fputs(HC[i], OUT);
}
fclose(IN);
fclose(OUT);
}
/*
* 函数名:CharCount
* 参数:一个指向文件的指针,以及一个整型数组
* 函数功能:统计文件中每个字符出现的次数,由Count数组带回字符出现的次数
* 返回值:无
*/
void CharCount(FILE *fp, int *Count, int length)
{
char ch;
int i;
/* 如果某个字符在文件中没有出现,则它的权为1 */
for (i = 0; i < length; i++)
{
Count[i]++;
}
/* 碰到一个出现的字符,就将它的权增1 */
while (!feof(fp))
{
ch = fgetc(fp);
Count[(ch) - 97]++;
}
}
int main(int argc, char* argv[])
{
/* 要进行霍夫曼编码的字符集 */
char CharSet[] = "abcdefghijklmnopqrstuvwxyz";
/* 字符的权 */
static int weight[26];
/* 字符集字符个数 */
int size, i;
/* 霍夫曼树变量 */
HuffmanTree HT;
/* 霍夫曼编码集 */
HuffmanCode HC;
FILE *IN;
if ((IN = fopen("success。
dat", "r")) == NULL)
{
printf("File Open Error!\n");
exit(1);
}
size = strlen(CharSet);
/* 统计各个字符在文件中出现的次数 */
CharCount(IN, weight, size);
/* 输出各字符在文件中出现的次数,次数为1表示在文件中没有出现该字符 */
printf("各个字符的权为:\n");
for (i = 0; i < size; i++)
{
printf("%3d", weight[i]);
if ((i+1) % 10 == 0)
printf("\n");
}
printf("\n");
fclose(IN);
/* 根据字符集和权值创建霍夫曼树 */
createHTree(HT, CharSet, weight, size);
/* 对哈夫曼树中的叶子结点进行编码 */
HuffmanCoding(HT, HC, size);
/* 输出各个字符对应的编码 */
printf("各个字符的编码分别为:\n");
for (i = 1; i <= size; i++)
{
printf("%c = %s\n", HT[i]。
ch, HC[i]);
}
/* 对文件进行编码,执行完后看看你的当前工作目录下的coding。dat文件,是不是有字符编码
了 */
Coding(HT, HC, size);
return 0;
}。
收起