数据结构程序设计作业——《哈夫曼编码》
数据结构课程设计哈夫曼编码样本

《数据构造与算法》课程设计(/第二学期第20周)指引教师:王教师班级:计算机科学与技术(3)班学号:姓名:《数据构造与算法》课程设计目录一、前言1.摘要2.《数据构造与算法》课程设计任务书二、实验目三、题目--赫夫曼编码/译码器1.问题描述2.基本规定3.测试规定4.实现提示四、需求分析--详细规定五、概要设计六、程序阐明七、详细设计八、实验心得与体会前言1.摘要随着计算机普遍应用与日益发展,其应用早已不局限于简朴数值运算,而涉及到问题分析、数据构造框架设计以及设计最短路线等复杂非数值解决和操作。
算法与数据构造学习就是为后来运用计算机资源高效地开发非数值解决计算机程序打下坚实理论、办法和技术基本。
算法与数据构造旨在分析研究计算机加工数据对象特性,以便选取恰当数据构造和存储构造,从而使建立在其上解决问题算法达到最优。
数据构造是在整个计算机科学与技术领域上广泛被使用术语。
它用来反映一种数据内部构成,即一种数据由那些成分数据构成,以什么方式构成,呈什么构造。
数据构造有逻辑上数据构造和物理上数据构造之分。
逻辑上数据构造反映成分数据之间逻辑关系,而物理上数据构造反映成分数据在计算机内部存储安排。
数据构造是数据存在形式。
《数据构造》重要简介某些最惯用数据构造,阐明各种数据构造内在逻辑关系,讨论其在计算机中存储表达,以及在其上进行各种运算时实现算法,并对算法效率进行简朴分析和讨论。
数据构造是介于数学、计算机软件和计算机硬件之间一门计算机专业核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等重要基本,广泛应用于信息学、系统工程等各种领域。
学习数据构造是为了将实际问题中所涉及对象在计算机中表达出来并对它们进行解决。
通过课程设计可以提高学生思维能力,增进学生综合应用能力和专业素质提高。
2.《数据构造与算法》课程设计任务书《数据构造与算法》是计算机专业重要核心课程之一,在计算机专业学习过程中占有非常重要地位。
北邮数据结构实验3哈夫曼编码

数据结构实验报告实验名称:实验3——哈夫曼编码学生姓名:班级:班内序号:学号:日期:2013年11月24日1.实验要求利用二叉树结构实现赫夫曼编/解码器。
基本要求:1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立赫夫曼树2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出。
3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。
4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。
5、打印(Print):以直观的方式打印赫夫曼树(选作)6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。
2. 程序分析2.1存储结构:struct HNode{char c;//存字符内容int weight;int lchild, rchild, parent;};struct HCode{char data;char code[100];}; //字符及其编码结构class Huffman{private:HNode* huffTree; //Huffman树HCode* HCodeTable; //Huffman编码表public:Huffman(void);void CreateHTree(int a[], int n); //创建huffman树void CreateCodeTable(char b[], int n); //创建编码表void Encode(char *s, string *d); //编码void Decode(char *s, char *d); //解码void differ(char *,int n);char str2[100];//数组中不同的字符组成的串int dif;//str2[]的大小~Huffman(void);};结点结构为如下所示:三叉树的节点结构:struct HNode//哈夫曼树结点的结构体{ int weight;//结点权值int parent;//双亲指针int lchild;//左孩子指针int rchild;//右孩子指针char data;//字符};示意图为:int weight int parent int lchild int rchild Char c 编码表节点结构:struct HCode//编码表结构体{char data;//字符char code[100];//编码内容};示意图为:基本结构体记录字符和出现次数:struct node{int num;char data;};示意图为:2.关键算法分析(1).初始化:伪代码:1.输入需要编译的文本内容2.将输入的内容保存到数组str1中3.统计出现的字符数目,并且保存到变量count中4.统计出现的不同的字符,存到str2中,将str2的大小存到dif中时间复杂度O(n!)(2).创建哈夫曼树算法伪代码:1.创建一个长度为2*n-1的三叉链表2.将存储字符及其权值的链表中的字符逐个写入三叉链表的前n个结点的data域,并将对应结点的孩子域和双亲域赋为空3.从三叉链表的第n个结点开始,3.1从存储字符及其权值的链表中取出两个权值最小的结点x,y,记录其下标x,y。
数据结构哈夫曼编码

Main.c文件如下#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include "Haffman.h"#define MaxBit 100void main(void){ Code *d;int i,j,n=26,m,weight[26]={0};char c,a=97;FILE *fp; //文本文件指针if((fp=fopen("data.txt","r"))==NULL){printf("无法打开此文件\n");exit(0); //中止程序}printf("待压缩的英文文本文件为:\n");while(!feof(fp)) //当扫描文件内容没有结束时{//读取字符并统计每个字符次数c=fgetc(fp);putchar(c);if(c>='a'||c<='z');c=c-32;for (i=65;i<=90;i++)if(c==i)weight[i-65]++ ;}fclose(fp);HaffNode *myHaffTree=(HaffNode *)malloc(sizeof(HaffNode)*(2*n-1));Code *myHaffCode=(Code *)malloc(sizeof(Code)*n);Haffman(weight,n,myHaffTree);HaffmanCode(myHaffTree,n,myHaffCode);for(m=0;m<n;m++){printf("\nzimu=%c Weight=%d Code=",a++,myHaffCode[m].weight);for(j=myHaffCode[m].start;j<n;j++)printf("%d",myHaffCode[m].bit[j]);printf("\n");}}头文件Huffman.h如下#ifndef Haffman_H_INCLUDED#define Haffman_H_INCLUDED#define MaxN 300#define MaxValue 10000typedef struct{int weight; //权值int flag; //标记int parent; //双亲结点下标int leftChild; //左孩子下标int rightChild; //右孩子下标}HaffNode; //哈夫曼树的结点结构typedef struct{int bit[MaxN]; //数组int start; //编码的起始下标int weight; //字符的权值}Code; //哈弗曼编码的结构void Haffman(int weight[],int n,HaffNode haffTree[])//建立叶节点个数为n,权值数组为weight的哈弗曼树haffTree{int i,j,m1,m2,x1,x2;//哈夫曼树haffTree初始化,n个叶节点的二叉树共有2n-1个结点for(i=0;i<2*n-1;i++){if(i<n) haffTree[i].weight=weight[i];else haffTree[i].weight=0;haffTree[i].parent=-1;haffTree[i].flag=0;haffTree[i].leftChild=-1;haffTree[i].rightChild=-1;}//构造哈弗曼树的n-1个非叶节点for(i=0;i<n-1;i++){m1=m2=MaxValue;x1=x2=0;for(j=0;j<n+i;j++) //找出权值最小和次小的子树{if((haffTree[j].weight<m1) && (haffTree[j].flag==0)){m2=m1;x2=x1;m1=haffTree[j].weight;x1=j;}else if((haffTree[j].weight<m2) && (haffTree[j].flag==0)){m2=haffTree[j].weight;x2=j;}}//将找出两棵权值最小和次小的子树合并为一棵子树haffTree[x1].parent=n+i;haffTree[x2].parent=n+i;haffTree[x1].flag=1;haffTree[x2].flag=1;haffTree[n+i].weight=haffTree[x1].weight+haffTree[x2].weight;haffTree[n+i].leftChild= x1;haffTree[n+i].rightChild=x2;}}void HaffmanCode(HaffNode haffTree[],int n,Code haffCode[])//由n个结点的哈夫曼树构造哈弗曼编码{Code *cd=(Code *)malloc(sizeof(Code));int i,j,child,parent;//求n个叶节点的哈弗曼编码for(i=0;i<n;i++){cd->start=n-1; //不等长编码的最后一位n-1cd->weight=haffTree[i].weight; //取得编码对应权值child=i;parent=haffTree[child].parent;//由叶节点向上直到根节点while(parent!=-1){if(haffTree[parent].leftChild==child)cd->bit[cd->start]=0; //左孩子分支编码0elsecd->bit[cd->start]=1; //左孩子分支编码1cd->start--;child=parent;parent=haffTree[child].parent;}for(j=cd->start+1;j<n;j++)haffCode[i].bit[j]=cd->bit[j]; //保存每个叶节点编码haffCode[i].start=cd->start+1; //保存叶节点编码的起始位haffCode[i].weight=cd->weight; //保存编码对应权值}}#endif // HFM_H_INCLUDED。
数据结构 程序设计 哈夫曼编码

学号数据结构课程设计设计说明书哈夫曼编码起止日期:2011年12月12 日至2011 年12月16日学生姓名班级成绩指导教师(签字)电子与信息工程系2011年12月16日一、设计目的 (3)二、设计要求 (3)三、设计内容 (3)一、需求分析 (3)1.构造哈夫曼树的方法如下: (3)2.程序实现的功能 (4)二、问题求解 (4)三、总体设计 (5)1.程序设计组成框图: (5)2.流程图: (6)四、详细设计 (6)1. 构造结点的结构体 (6)2. 构造哈夫曼树 (6)3. 求哈夫曼编码 (6)五、调试与测试 (7)1.测试过程中遇到的主要问题 (7)六、关键源程序清单和执行结果 (7)1.源代码: (7)2.执行结果: (10)四、参考文献 (11)天津城市建设学院课程设计任务书2011—2012学年第1学期电子与信息工程系软件工程专业班级课程设计名称:数据结构课程设计设计题目:哈夫曼编码完成期限:自2011 年12 月12 日至2011 年12 月16 日共 1 周设计依据、要求及主要内容(可另加附页):一、设计目的熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。
二、设计要求(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。
凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩;(3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表;(4)认真编写课程设计报告。
三、设计内容一、需求分析1.构造哈夫曼编码的方法如下:第一步定义一个结点的结构体,包括结点的权值,结点的双亲结点,左孩子,右孩子。
并定义两个HTNode,*HuffmanTree为该类型的名字。
第二步创建一个Select函数用来选择结点较小的结点权值和下标。
数据结构课程设计哈夫曼编码实验

数据结构设计性实验Huffman编码与译码学号姓名班级设计性实验—Huffman 编码与译码一.实验目的:在掌握相关基础知识的基础上,学会自己设计实验算法,熟练掌握Huffman 树的建立方法,Huffman 编码的方法,进而设计出Huffman 译码算法,并编程实现。
二.实验要求:在6学时以内,制作出能够实现基于26个英文字母的任意字符串的编译码。
写出技术工作报告并附源程序。
三.实验内容及任务:1.设字符集为26个英文字母,其出现频度如下表所示。
2.建Huffman 树; 3.利用所建Huffman 树对任一字符串文件进行编码——即设计一个Huffman 编码器;4.对任一字符串文件的编码进行译码——即设计一个Huffman 译码器。
实现步骤:1.数据存储结构设计; 2.操作模块设计; 3.建树算法设计; 4.编码器设计;5. 译码器设计;51 48 1 15 63 57 20 32 5 1频度z y x w v u t 字符11611882380频度p 21 f q15 g r 47 h s o n m l k j 字符 57 103 32 22 13 64 186 频度 i e d c b a 空格 字符四.分析以及算法描述1.分析问题1)首先学习二叉树的知识,了解二叉树的路径、权数以及带权路径长度计算。
2)认识霍夫曼树,了解霍夫曼树的定义,构造霍夫曼树构造算法①又给定的n个权值{w1,w2,w3,……,w n}构造根节点的二叉树,从而得到一个二叉树森林F={T1,T2,T3,……T n}。
②在二叉树森里选取根节点全职最小和此最小的两棵二叉树作为左右节点构造新的二叉树,此时新的二叉树的根节点权值为左右子树权值之和。
③在二叉树森林中删除作为新二叉树的根节点左右子树的两棵二叉树,将新的二叉树加入到二叉树森林F中。
④重复②和③,当二叉树森林F只剩下一棵二叉树时,这棵二叉树是所构造的霍夫曼树。
3)练习通过普通树来构造霍夫曼树。
(完整word版)数据结构课程设计(哈夫曼编码)

目录目录 (1)1 课程设计的目的和意义 (3)2 需求分析 (5)3 系统设计 (6)(1)设计思路及方案 (6)(2)模块的设计及介绍 (6)(3)主要模块程序流程图 (9)4 系统实现 (14)(1)主调函数 (14)(2)建立HuffmanTree (14)(3)生成Huffman编码并写入文件 (18)(4)电文译码 (19)5 系统调试 (22)小结 (25)参考文献 (26)附录源程序 (27)1 课程设计的目的和意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。
哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。
哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。
树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0"码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1"的序列作为和各个对应的字符的编码,这就是哈夫曼编码。
通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。
电报通信是传递文字的二进制码形式的字符串。
但在信息传递时,总希望总长度尽可能最短,即采用最短码。
作为软件工程专业的学生,我们应该很好的掌握这门技术。
在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。
在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。
这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。
在课程设计过程中,我们不但有自己的独立思考,还借助各种参考文献来帮助我们完成系统。
更为重要的是,我们同学之间加强了交流,在对问题的认识方面可以交换不同的意见.同时,师生之间的互动也随之改善,我们可以通过具体的实例来从老师那学到更多的实用的知识。
数据结构课程设计哈夫曼编码

数据结构课程设计报告题目:赫夫曼编码一、需求分析1. 问题描述利用赫夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站编写一个赫夫曼码的编/译码系统。
2.基本要求一个完整的系统应具有以下功能:(1) I:初始化(Initialization)。
从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmTree中。
(2) E:编码(Encoding)。
利用已建好的赫夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
(3) D:译码(Decoding)。
利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。
(4) P:印代码文件(Print)。
将文件CodeFile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrin中。
(5) T:印赫夫曼树(Tree printing)。
将已在内存中的赫夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的赫夫曼树写入文件TreePrint 中。
3.测试要求(1) 已知某系统在通信联络中只可能出现八种字符,其频率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计赫夫曼编码。
(2) 用下表给出的字符集和频度的实际统计数据建立赫夫曼树,并实现以下报文的编码和译码:“THIS PROGRAME IS MY FA VORITE”。
4.实现提示(1) 编码结果以文本方式存储在文件Codefile中。
(2) 用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”,表示退出运行Quit。
数据结构哈夫曼编码实验报告-无删减范文

数据结构哈夫曼编码实验报告数据结构哈夫曼编码实验报告实验背景哈夫曼编码是一种常用的数据压缩方法,通过使用变长编码来表示不同符号,将出现频率较高的符号用较短的编码表示,从而达到压缩数据的目的。
通过实现哈夫曼编码算法,我们能够更好地理解和掌握数据结构中的树形结构。
实验目的1. 理解哈夫曼编码的原理及实现过程。
2. 掌握数据结构中树的基本操作。
3. 进一步熟悉编程语言的使用。
实验过程1. 构建哈夫曼树首先,我们需要根据给定的字符频率表构建哈夫曼树。
哈夫曼树是一种特殊的二叉树,其叶子节点表示字符,而非叶子节点表示字符的编码。
构建哈夫曼树的过程如下:1. 根据给定的字符频率表,将每个字符视为一个节点,并按照频率从小到大的顺序排列。
2. 将频率最小的两个节点合并为一个新节点,并将其频率设置为两个节点的频率之和。
这个新节点成为新的子树的根节点。
3. 将新节点插入到原来的节点列表中,并继续按照频率从小到大的顺序排序。
4. 重复步骤2和步骤3,直到只剩下一个节点,这个节点即为哈夫曼树的根节点。
2. 哈夫曼编码表在构建完哈夫曼树后,我们需要根据哈夫曼树每个字符的哈夫曼编码表。
哈夫曼编码表是一个字典,用于存储每个字符对应的编码。
哈夫曼编码表的过程如下:1. 从哈夫曼树的根节点出发,遍历整个树。
2. 在遍历的过程中,维护一个路径,用于记录到达每个字符节点的路径,0表示左子树,1表示右子树。
3. 当到达一个字符节点时,将路径上的编码存储到哈夫曼编码表中对应的字符键下。
3. 压缩数据有了哈夫曼编码表后,我们可以使用哈夫曼编码对数据进行压缩。
将原本以字符表示的数据,转换为使用哈夫曼编码表示的二进制数据。
压缩数据的过程如下:1. 将待压缩的数据转换为对应的哈夫曼编码,将所有的编码连接成一个字符串。
2. 将该字符串表示的二进制数据存储到文件中,同时需要保存哈夫曼编码表以便解压时使用。
实验结果通过实验,我们成功实现了哈夫曼编码的构建和使用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告题目哈夫曼编码学生姓名王某某专业班级测控120X班学号U2012XXXXX1 问题描述输入一字符串,以字符串中各字符出现的频数为权值构造哈夫曼编码。
然后输入一0—1序列,根据生成的哈夫曼编码解码序列。
2 算法描述(1)哈夫曼树的表示设计哈夫曼树的结构体(htnode),其中包含权重、左右孩子、父母和要编码的字符。
用这个结构体(htnode)定义个哈夫曼数组(hfmt[])。
迷宫定义如下:typedef struct{int weight;int lchild;int rchild;int parent;char key;}htnode;typedef htnode hfmt[MAXLEN];(2)对原始字符进行编码初始化哈夫曼树(inithfmt)。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。
并显示出每个字符的编码。
1.void inithfmt(hfmt t)//对结构体进行初始化2.void inputweight(hfmt t)//输入函数3.void selectmin(hfmt t,int i,int *p1,int *p2)//选中两个权值最小的函数4.void creathfmt(hfmt t)//创建哈夫曼树的函数5.void phfmnode(hfmt t)//对字符进行初始编码(3)对用户输入的字符进行编码void encoding(hfmt t)//对用户输入的电文进行编码{char r[1000];//用来存储输入的字符串int i,j;printf("\n\n请输入需要编码的字符:");gets(r);printf("编码结果为:");for(j=0;r[j]!='\0';j++)for(i=0;i<n;i++)if(r[j]==t[i].key)hfmtpath(t,i,j);printf("\n");}(4)对用户输入的字符进行编码void decoding(hfmt t)//对用户输入的密文进行译码{char r[100];int i,j,len;j=2*n-2;//j初始从树的根节点开始printf("\n\n请输入需要译码的字符串:"); gets(r);len=strlen(r);printf("译码的结果是:");for(i=0;i<len;i++){if(r[i]=='0'){j=t[j].lchild;if(t[j].lchild==-1){printf("%c",t[j].key);j=2*n-2;}}else if(r[i]=='1'){j=t[j].rchild;if(t[j].rchild==-1){printf("%c",t[j].key); j=2*n-2;}}}printf("\n\n");}3 程序设计流程图4 运行测试1.用户输入字符串,以回车键作为结束2.对字符统计打印统计结果、编码表和编码结果3.对一串数据解码4.统计编码前后的数据大小,计算压缩率5 实验收获代码编写完会有很多与预期不同的结果,耐心调试,修改代码,开始写代码的时候就认真的写,在调试时找出逻辑问题比较困难,做到一步到位。
此外程序编完后有时间可以对其中的一些算法优化,另外了调整输出界面,看起来更加美观。
附:程序代码#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct{int weight;int parent,lchild,rchild;}HTNode,*HuffmanTree;//动态分配数组存储哈弗曼树typedef char** Huffmancode;//动态分配数组存储哈弗曼编码表unsigned int wordweight[26];HuffmanTree HT;Huffmancode HC;void HuffmanCoding(int n);void Select(int i,int*t1,int*t2);void for_weight(void); //求每个字母的权值void HuffmanDecoding();int main(){int i;char c;printf("输入1-哈弗曼编码,输入2-哈弗曼解码,输入3-退出程序\n");while((c=getchar())!='3'){if(c=='1'){HuffmanCoding(26);for(i=1;i<=26;i++) printf("%c的哈弗曼编码为%s\n",'a'+i-1,HC[i]);printf("输入1-哈弗曼编码,输入2-哈弗曼解码,输入3-退出程序\n");}if (c=='2'){HuffmanDecoding();printf("输入1-哈弗曼编码,输入2-哈弗曼解码,输入3-退出程序\n");}}}void HuffmanCoding(int n){void Select(int,int*,int*);char *cd;int i,m,start,f;int s1,s2,c;if(n<=1){return;}m=2*n-1;HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));for(i=1;i<=n;++i){HT[i].weight=wordweight[i-1];HT[i].lchild=0;HT[i].rchild=0;HT[i].parent=0;}for(;i<=m;++i){HT[i].weight=0;HT[i].lchild=0;HT[i].rchild=0;HT[i].parent=0;}for(i=n+1;i<=m;++i){Select(i,&s1,&s2);HT[s1].parent=i;HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;HT[i].weight=HT[s1].weight+HT[s2].weight;};//从叶子到根逆向求每个字符的哈弗曼编码HC=(Huffmancode)malloc((n+1)*sizeof(char *));cd=(char*)malloc(n*sizeof(char));cd[n-1]='\0';for(i=1;i<=n;i++){start =n-1;for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent){if(HT[f].lchild==c)cd[--start]='0';else cd[--start]='1';HC[i]=(char*)malloc((n-start)*sizeof(char));strcpy(HC[i],&cd[start]);}}}void Select(int i,int*t1,int*t2){int j=1;while(HT[j].parent!=0){j++;}*t1=j;for(;j<=i;j++){if(HT[j].parent==0&&(HT[j].weight<HT[*t1].weight)) *t1=j;}HT[*t1].parent=1;j=1;while(HT[j].parent!=0){j++;}*t2=j;for(;j<=i;j++){if(HT[j].parent==0&&(HT[j].weight<HT[*t2].weight)) *t2=j;}}void for_weight(void) //求每个字母的权值{FILE *fp;char t_char;int t,i;if((fp=fopen("哈弗曼编码.txt","r"))==NULL){printf("不能打开文件\n");exit(1);}t_char= fgetc(fp);for(i=0;i<26;i++) wordweight[i]=0;while (t_char!= EOF){if((t_char>='a')&&(t_char<='z')) t=t_char-'a';if((t_char>='A')&&(t_char<='Z')) t=t_char-'A';wordweight[t]+=1;t_char= fgetc(fp);}fclose(fp);}void HuffmanDecoding(){ int j,i=51,n=0;printf("请输入5位数的哈弗曼编码\n");char s[6];scanf("%s",s);while(i!=0){if (*(s+n)=='0'){i=HT[i].lchild;}else if(*(s+n)=='1')i=HT[i].rchild;else i=HT[i].lchild;n++;if(i!=0)j=i;}printf("该哈弗曼编码对应的字符为:%c\n",'a'-1+j); }- 10 -。