哈夫曼编译码器课程设计报告完整版.docx

上传人:b****1 文档编号:1586812 上传时间:2022-10-23 格式:DOCX 页数:29 大小:138.72KB
下载 相关 举报
哈夫曼编译码器课程设计报告完整版.docx_第1页
第1页 / 共29页
哈夫曼编译码器课程设计报告完整版.docx_第2页
第2页 / 共29页
哈夫曼编译码器课程设计报告完整版.docx_第3页
第3页 / 共29页
哈夫曼编译码器课程设计报告完整版.docx_第4页
第4页 / 共29页
哈夫曼编译码器课程设计报告完整版.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

哈夫曼编译码器课程设计报告完整版.docx

《哈夫曼编译码器课程设计报告完整版.docx》由会员分享,可在线阅读,更多相关《哈夫曼编译码器课程设计报告完整版.docx(29页珍藏版)》请在冰豆网上搜索。

哈夫曼编译码器课程设计报告完整版.docx

哈夫曼编译码器课程设计报告完整版

XXX学院本科

数据结构课程设计总结报告

 

设计题目:

实验一、哈夫曼编/译码器

学生姓名:

XXX

系别:

XXX

专业:

XXX

班级:

XXX

学号:

XXX

指导教师:

XXXXXX

 

 

2012年6月21日

xxx学院

课程设计任务书

题目一、赫夫曼编译码器

专业、班级xxx

学号xxx姓名xxx

主要内容、基本要求、主要参考资料等:

1.主要内容

利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。

要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。

对于双工信道(既可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼的编/译码系统。

2.基本要求

系统应具有以下功能:

(1)C:

编码(Coding)。

对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中,将以此建好的哈夫曼树存入文件HuffmanTree中

(2)D:

解码(Decoding)。

利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。

(3)P:

打印代码文件(Print)。

将文件codefile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件codeprint中。

(4)T:

打印哈夫曼树(TreePrinting)。

将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。

3.参考资料:

数据结构(C语言版)严蔚敏、吴伟民编著;

数据结构标准教程胡超、闫宝玉编著

完成期限:

2012年6月21日

指导教师签名:

课程负责人签名:

2012年6月21日

一、设计题目(任选其一)

实验一、哈夫曼编/译码器

二、实验目的

1巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力;

2深化对算法课程中基本概念、理论和方法的理解;

3巩固构造赫夫曼树的算法;

4设计试验用程序实验赫夫曼树的构造。

三、运行环境(软、硬件环境)

Windowsxpsp3,VisualC++6.0英文版

四、算法设计的思想

(1)初始化赫夫曼树,输入文件tobetrans.txt中各字符及其权值,并保存于hfmtree.txt文件中

(2)编码(Coding)。

对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中

(3)D:

解码(Decoding)。

利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。

(4)P:

打印代码文件(Print)。

将文件codefile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件codeprint中。

(5)T:

打印哈夫曼树(TreePrinting)。

将已在内存中的哈夫曼树以直观的方式显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。

五、流程图

六、算法设计分析

1.赫夫曼树节点的数据类型定义为:

typedefstruct{//赫夫曼树的结构体

charch;

intweight;//权值

intparent,lchild,rchild;

}HTNode,*HuffmanTree;

2.voidHuffmanCoding(HuffmanTree&,char*,int*,int);建立赫夫曼树的算法,此函数块调用了Select()函数。

voidselect(HuffmanTreeHT,intj,int*x,int*y);从已建好的赫夫曼树中选择parent为0,weight最小的两个结点。

3.利用已建好的哈夫曼树从文件hfmtree.txt中读入,对文件中的正文进行编码,然后将结果存入文件code中。

4.coding

编码功能:

对输入字符进行编码

5.Decoding

译码功能:

利用已建好的哈夫曼树将文件code中的代码进行译码,结果存入文件text中。

6.Print()打印功能函数:

输出哈夫曼树以及对应的编码。

七、源代码

//////////////////////////////////////////////////////////////////////////////////////////

#include

#include

#include

//定义赫夫曼树结点的结构体

typedefstruct{

charch;//增加一个域,存放该节点的字符

intweight;

intparent,lchild,rchild;

}HTNode,*HuffmanTree;

typedefchar**HuffmanCode;//指向赫夫曼编码的指针

voidtips();//打印操作选择界面

voidHuffmanCoding(HuffmanTree&,char*,int*,int);//建立赫夫曼树的算法

voidselect(HuffmanTreeHT,intj,int*x,int*y);//从已建好的赫夫曼树中选择parent为0,weight最小的两个结点

voidInit();

voidCoding();//编码

voidDecoding();//译码

voidPrint_code();//打印译码好的代码

voidPrint_tree();//打印哈夫曼树

intRead_tree(HuffmanTree&);//从文件中读入赫夫曼树

voidfind(HuffmanTree&HT,char*code,char*text,inti,intm);//译码时根据01字符串寻找相应叶子节点的递归算法

voidConvert_tree(unsignedcharT[100][100],ints,int*i,intj);//将内存中的赫夫曼树转换成凹凸表形式的赫夫曼树

HuffmanTreeHT;//全局变量

intn=0;//全局变量,存放赫夫曼树叶子结点的数目

intmain()

{

charselect;

while

(1)

{

tips();

scanf("%c",&select);

switch(select)//选择操作,根据不同的序号选择不同的操作

{

case'1':

Init();

break;

case'2':

Coding();

break;

case'3':

Decoding();

break;

case'4':

Print_code();

break;

case'5':

Print_tree();

break;

case'0':

exit

(1);

default:

printf("Inputerror!

\n");

}

getchar();

}

return0;

}

voidtips()//操作选择界面

{

printf("-----------------------------------------------------\n");

printf("--请选择操作--\n");

printf("-----------------------------------------------------\n");

printf("\n");

printf("---------------------1初始化赫夫曼树---------------\n");

printf("---------------------2编码---------------\n");

printf("---------------------3译码---------------\n");

printf("---------------------4打印代码文件---------------\n");

printf("---------------------5打印赫夫曼树---------------\n");

printf("---------------------0退出---------------\n");

printf("-----------------------------------------------------\n");

}

 

//初始化函数,输入n个字符及其对应的权值,根据权值建立哈夫曼树,并将其存于文件hfmtree中

voidInit()

{

FILE*fp;

inti,n,w[52];//数组存放字符的权值

charcharacter[52];//存放n个字符

printf("\n输入字符个数n:

");

scanf("%d",&n);//输入字符集大小

printf("输入%d个字符及其对应的权值:

\n",n);

for(i=0;i

{

charb=getchar();

scanf("%c",&character[i]);

scanf("%d",&w[i]);//输入n个字符和对应的权值

}

HuffmanCoding(HT,character,w,n);//建立赫夫曼树

if((fp=fopen("hfmtree.txt","w"))==NULL)

printf("Openerror!

\n");

for(i=1;i<=2*n-1;i++)

{

if(fwrite(&HT[i],sizeof(HTNode),1,fp)!

=1)//将建立的赫夫曼树存入文件hfmtree.txt中

printf("error!

\n");

}

printf("\n赫夫曼树建立成功,并已存于文件hfmtree.txt中\n");

fclose(fp);

}

//建立赫夫曼树的算法

voidHuffmanCoding(HuffmanTree&HT,char*character,int*w,intn)

{

intm,i,x,y;

HuffmanTreep;

if(n<=1)return;

m=2*n-1;

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

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

{p->ch=*character;p->weight=*w;p->parent=0;p->lchild=0;p->rchild=0;}

for(;i<=m;++i,++p){p->ch=0;p->weight=0;p->parent=0;p->lchild=0;p->rchild=0;}

for(i=n+1;i<=m;++i)

{

select(HT,i-1,&x,&y);

HT[x].parent=i;HT[y].parent=i;

HT[i].lchild=x;HT[i].rchild=y;

HT[i].weight=HT[x].weight+HT[y].weight;

}

}

 

//从HT[1]到HT[j]中选择parent为0,weight最小

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1