数据结构 哈夫曼树的实验报告

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

软件学院设计性实验报告

二、理解哈夫曼树的特征及其应用;在对哈夫曼树进行理解的基础上, 构造哈夫曼树, 并用

构造的哈夫曼树进行编码和译码;通过该实验, 使学生对数据结构的应用有更深层次的理解。

三、实验仪器或设备

四、学院提供公共机房, 1台/学生微型计算机。

五、总体设计(设计原理、设计方案及流程等)

1. 问题描述:

利用哈夫曼编码进行通信可以大大提高信道利用率, 缩短信息传输时间, 降低传输成本。但是, 这要求在发送端通过一个编码系统对待传数据预先编码, 在接收端将传来的数据进行译码(解码)。对于双工信道(即可以双向传输信息的信道), 每端都需要一个完整的编/译码系统。试为这样的信息收发站设计一个哈夫曼编/译码系统。

2. 一个完整的系统应具有以下功能:

1)初始化(Initialzation)。从数据文件DataFile.dat中读入字符及每个字符的权值, 建立哈夫曼树HuffTree;

2)编码(EnCoding)。用已建好的哈夫曼树, 对文件ToBeTran.dat中的文本进行编码形成报文, 将报文写在文件Code.txt中;

3)译码(Decoding)。利用已建好的哈夫曼树, 对文件CodeFile.dat中的代码进行解码形成原文, 结果存入文件Textfile.txt中;

4)输出(Output): 输出DataFile.dat中出现的字符以及各字符出现的频度(或概率);输出ToBeTran.dat及其报文Code.txt;输出CodeFile.dat及其原文Textfile.txt;

六、要求: 所设计的系统应能在程序执行的过程中, 根据实际情况(不同的输入)建立

DataFile.dat、ToBeTran.dat和CodeFile.dat三个文件, 以保证系统的通用性。

七、实验步骤(包括主要步骤、代码分析等)

1)编写C语言程序

#include<string.h>

#include<malloc.h>

#include<stdio.h>

#include<iostream.h>

#include<math.h>

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

typedef struct

{

char data;

int weight;

int parent,lchild,rchild;

}HTNode,*HuffmanTree;

typedef char **HuffmanCode;

void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,char *d,int *w,int n) //构造哈弗曼函数HT, 构造编码HC

{

void select(HuffmanTree HT,int n,int &s1,int &s2);

int m,c,f,j;

HuffmanTree p;

int i,s1,s2,start;

char *cd;

m=2*n-1; //m为结点数, n为叶子数

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));

p=HT;

p++;

for(i=1;i<=n;i++,p++) //将叶子的值输入HT中

{

p->data=d[i]; //={*d,*w,0,0,0};

p->weight=w[i];

p->parent=0;

p->lchild=0;

p->rchild=0;

}

for (i=n+1;i<=m;i++,p++) //={'#',0,0,0,0} {

p->data='#';

p->weight=0;

p->parent=0;

p->lchild=0;

p->rchild=0;

}

s1=1;

s2=2;

for(i=n+1;i<=m;i++) //构建哈夫曼树

{

select(HT,i-1,s1,s2);

HT[i].lchild=s1;

HT[i].rchild=s2;

HT[i].weight=HT[s1].weight+HT[s2].weight;

HT[s1].parent=i;

HT[s2].parent=i;

}

HC=(HuffmanCode)malloc((n+1)*sizeof(HuffmanTree)); //开辟空间, 编码

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]);

printf("%c的编码是: ",HT[i]);

puts(HC[i]);

}

free(cd);

}

void select(HuffmanTree HT,int n,int &s1,int &s2) //求最小两数

{

int i,t;

相关文档
最新文档