哈夫曼HuffmanWord文件下载.docx
- 文档编号:12959239
- 上传时间:2022-10-01
- 格式:DOCX
- 页数:21
- 大小:155.20KB
哈夫曼HuffmanWord文件下载.docx
《哈夫曼HuffmanWord文件下载.docx》由会员分享,可在线阅读,更多相关《哈夫曼HuffmanWord文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
印代码文件(Print).
5)T:
印哈夫曼树(TreePrinting).
七.测试分析----------------------------
八.使用说明----------------------------
九.测试数据---------------------------
十.课程设计总结-------------------------
一.题目:
哈夫曼(Huffman)编/译码器
二.设计目标
通过课程设计,巩固和加深对线性表,栈,树(哈夫曼树),字符串等理论知识的理解,更好地掌握C语言的基本知识和语法法则.从而培养和提高我们编写程序的能力,而且能帮助学生熟练地掌握表达式求值中前缀表达式求值和中缀表达式求值的实现.
三.问题描述
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本.但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原).对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统.试为这样的信息收发站写一个哈夫曼码的编/译码系统.
四.需求分析
一个完整的系统应具有以下功能:
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:
印哈夫曼树(TreePrinting)
将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中.
五.概要设计
1.哈夫曼树的定义
typedefstruct
{//赫夫曼树的结构体
charch;
intweight;
//权值
intparent,lchild,rchild;
}htnode,*hfmtree;
typedefchar**hfmcode;
2.所实现的功能如下:
1)调用Select()函数,选出HT树到a为止,权值最小且parent为0的2个结点.
2)构建哈夫曼树HT,调用hfmcoding()函数,并求出n个字符的哈夫曼编码HC,(初始化n个叶子结点,初始化其余的结点).
3)输出哈夫曼编译码器菜单,并进行选择,当choice的值不为q且不为Q时循环.
4)对数据进行编码,并将字符放入ToBeTran.txt,码值放入CodeFile.txt中.
5)对数据进行译码,读入CodeFile.txt中的编码进行译码,将译出来的字符放入Textfile.txt中.
6)打印代码函数Print().
7)打印哈夫曼树TreePrinting().
8)退出程序.
六.详细设计
总体操作步骤:
1) 定义和构建哈夫曼树(hfmcoding).
2)I:
初始化哈夫曼树(Initialization).
3)E:
4)D:
5)P:
6)T:
程序源代码:
#include<
stdio.h>
stdlib.h>
string.h>
cstdio>
typedefstruct
{//哈夫曼树的结构体
voidSelect(hfmtreeHT,inta,int*p1,int*p2)
{//Select函数,选出HT树到a为止,权值最小且parent为0的2个结点
inti,j,x,y;
for(j=1;
j<
=a;
++j)
{
if(HT[j].parent==0)
{
x=j;
break;
}
}
for(i=j+1;
i<
++i)
if(HT[i].weight<
HT[x].weight&
&
HT[i].parent==0)//选出最小的结点
x=i;
if(HT[j].parent==0&
x!
=j)
{
y=j;
break;
}
++i)
HT[y].weight&
HT[i].parent==0&
=i)
y=i;
//选出次小的结点
if(x>
y)
*p1=y;
*p2=x;
else
*p1=x;
*p2=y;
}
}
voidhfmcoding(hfmtreeHT,hfmcodeHC,intn)
{//构建哈夫曼树HT,并求出n个字符的哈夫曼编码HC
inti,start,c,f,m,w;
intp1,p2;
char*cd,z;
if(n<
=1)
{
return;
m=2*n-1;
HT=(hfmtree)malloc((m+1)*sizeof(htnode));
for(i=1;
=n;
++i)//初始化n个叶子结点
printf("
请输入第%d个字符和权值:
"
i);
scanf("
%c%d"
&
z,&
w);
while(getchar()!
='
\n'
)
continue;
HT[i].ch=z;
HT[i].weight=w;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
for(;
=m;
++i)//初始化其余的结点
HT[i].ch='
0'
;
HT[i].weight=0;
for(i=n+1;
++i)//建立哈夫曼树
Select(HT,i-1,&
p1,&
p2);
HT[p1].parent=i;
HT[p2].parent=i;
HT[i].lchild=p1;
HT[i].rchild=p2;
HT[i].weight=HT[p1].weight+HT[p2].weight;
HC=(hfmcode)malloc((n+1)*sizeof(char*));
cd=(char*)malloc(n*sizeof(char));
cd[n-1]='
\0'
++i)//给n个字符编码
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]='
}
else
1'
HC[i]=(char*)malloc((n-start)*sizeof(char));
strcpy(HC[i],&
cd[start]);
free(cd);
intmain()
{
charcode[100],h[100],hl[100];
intn=0,i,j,k,l;
FILE*fp=0;
charchoice,str[100];
hfmtreeHT=0;
hfmcodeHC=0;
printf("
\n"
);
while(choice!
Q'
&
choice!
q'
)//当choice的值不为q且不为Q时循环
哈夫曼编/译码器\n"
I.(初始化)Init\n"
E.(编码)Encoding\n"
D.(译码)Decoding\n"
P.(印代码文件)Print\n"
T.(印哈夫曼树)TreePrinting\n"
Q.(退出)Exit\n"
请输入您要操作的步骤:
"
%s"
choice);
if(choice=='
I'
||choice=='
i'
)//初始化哈夫曼树
printf("
请输入字符个数:
scanf("
%d"
n);
hfmcoding(HT,HC,n);
for(i=1;
printf("
%s:
%s\n"
HT[i].ch,HT[i]);
fopen("
hfmTree.txt"
"
r+"
if(fopen("
Textfile.txt"
)==NULL)
can'
topenfile!
return1;
i++)
fprintf(fp,"
%s%s"
HT[i].ch,&
HT[i]);
fclose(fp);
哈夫曼树已经创建完毕,并且已经放入h
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼 Huffman