数据结构课程设计哈夫曼树及编码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计哈夫曼树及编码

HUFFMAN树及编码

1.需求分析

随机输入一篇英文文章(或读一个TXT文件),生成并显示HUFFMAN树,输出每个字母的HUFFMAN编码,判断ASCII编码与HUFFMAN编码对本篇报文长度节省效果。

(a) 输入的形式为键盘随机输入,输入的字符串长度在10000以内;

(b) 输出HUFFMAN树的存储结构;

(c) 程序功能为输入英文文章中每个字母的HUFFMAN编码,以及与ASCLL码编码长度的比较结果;

(d) 测试数据:正确的输入一篇英文文章,会输出各个字母的HUFFMAN编码。错误的输入即其输出输入错误。

2. 概要设计

首先统计英文文章中各个字母的个数作为权值,再统计出现的字母的个数,以决定所构造赫夫曼树的节点个数,之后便开始构造赫夫曼树,再构造每个节点的哈夫曼编码。

所设计的抽象数据类型如下:

typedef struct

{

unsigned int weight; //权值

unsigned int parent, lchild, rchild; //双亲,左孩子,右孩子

} HTNode, * HuffmanTree;

typedef char * * HuffmanCode;

所设计的函数如下:

int min(HuffmanTree HT, int i) 找出所有权值中最小的那个。

void Select(HuffmanTree HT, int i, int &s1, int &s2) 找出每次最小的两个权值最小的权值。

Status HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)

构造赫夫曼树并构造每个字母的赫夫曼编码。

void PrintHT(HuffmanTree HT, int n)

输出赫夫曼树的存储结构。

3. 详细设计

int min(HuffmanTree HT, int i)

{int j, flag = 1;

unsigned int k = 10000;

for(j = 1; j <= i; j++)

{

if(HT[j].weight < k && HT[j].parent == 0)

{

k = HT[j].weight, flag = j;

}//if

}

HT[flag].parent = 1;

return flag;

}

void Select(HuffmanTree HT, int i, int &s1, int &s2)

{

int j;

s1 = min(HT, i);

s2 = min(HT, i);

if(s1 > s2)

{

j = s1;

s1 = s2;

s2 = j;

}

}

Status HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)

{

int s1, s2, i, start, f;

char *cd;

HuffmanTree p = NULL;//p是工作指针,指向赫夫曼树中的

结点

if(n <= 1)

{

return ERROR;

}

int m = 2 * n - 1; //n个字符构造的赫夫曼树共有m = 2*n-1个结点

printf("->待构造的赫夫曼树共有2 ×%d - 1 = %d个结点\n", n, m);

if(!(HT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode))))//申请赫夫曼树结点占用的内存空间,0号单元不用

{

exit(OVERFLOW);

}//if

printf("->赫夫曼树共分配了%d个结点空间,其中包含一个不用的0号单元\n", m + 1);

//printf("->初始化所有叶子节点的权值,父亲和孩子:\n");

for(p = HT + 1, i = 1; i <= n; ++i, ++p, ++w)

{

p->weight = *w;

p->parent = 0;//双亲初始值为0,表示此结点还没有被选择最小的算法选择过

相关文档
最新文档