数据结构课程设计报告哈夫曼树.docx

上传人:b****3 文档编号:26669436 上传时间:2023-06-21 格式:DOCX 页数:21 大小:159.94KB
下载 相关 举报
数据结构课程设计报告哈夫曼树.docx_第1页
第1页 / 共21页
数据结构课程设计报告哈夫曼树.docx_第2页
第2页 / 共21页
数据结构课程设计报告哈夫曼树.docx_第3页
第3页 / 共21页
数据结构课程设计报告哈夫曼树.docx_第4页
第4页 / 共21页
数据结构课程设计报告哈夫曼树.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

数据结构课程设计报告哈夫曼树.docx

《数据结构课程设计报告哈夫曼树.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告哈夫曼树.docx(21页珍藏版)》请在冰豆网上搜索。

数据结构课程设计报告哈夫曼树.docx

数据结构课程设计报告哈夫曼树

课程设计

 

课程设计名称:

数据构造课程设计

专业班级:

学生姓名:

学号:

指导教师:

课程设计时间:

2015.7.06—2015.7.10

 

计算机类专业课程设计任务书

学生

专业班级

学号

题目

哈夫曼树编/译码系统

课题性质

A

课题来源

D

指导教师

同组

主要容

1.学习掌握并熟练运用C语言进展程序设计,

2.针对具体应用问题,选择、设计和实现适宜的抽象数据类型;

3.进展整体设计使各个函数之间严密联系起来;

任务要求

1.综合运用和融化所学理论知识,提高分析和解决实际问题的能力,到达培养良好程序设计能力和习惯的目的,为开发满足问题要求的小型应用软件奠定根底,到达软件工程的综合性根底训练的目的。

2.完成需求分析报告,报告中对关键局部给出图表说明。

要求格式规,工作量饱满。

参考文献

?

C语言程序设计?

〔第三版〕谭浩强清华大学

?

CPrimerPlus?

(第5版)Stephen prata人民邮电

审查意见

指导教师签字:

教研室主任签字:

年月日

 

 

1需求分析

1.1系统介绍

利用Huffman编码进展通信可以大大提高信道利用率.缩短信息传输时间,降低传输本钱,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进展译码〔复原〕。

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

此程序就是为这样的信息收发站写一个Huffman码的编/译码系统。

1.2程序的输入和输出

从终端读入字符集大小n,以及n个字符及各个字符的权值,建立赫夫曼树,并将它存储到文件hfmTree中;利用已建好的赫夫曼树将文件中的字符编码,如果赫夫曼树不在存中,那么从文件hfmTree中读取到存;将译得的代码存到文件CodeFile中;利用已建好的赫夫曼树对CodeFile中的代码进展译码,将结果存入文件TextFile中;最后将已在存中的哈夫曼树以直观的方式〔树或凹入表形式〕显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

1.3程序要到达的功能

用户可以利用菜单根据自己的需要来选择要进展编码或是译码,并将转换好的字符或编码以文件的形式存到相应的文件里面。

1.4调试过程介绍

〔l〕利用教材中的数据调试程序。

〔2〕用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:

"THISPROGRAMISMYFAVORITE"。

字符

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

频度

186

64

13

22

32

103

21

15

47

57

1

5

32

20

57

63

15

1

48

51

80

23

8

18

1

16

1

选择2,输入THISPROGRAMISMYFAVORITE,屏幕上显示01010

同时文件codefile里面也出现相应的代码

选择3,从codefile中调入代码,终端显示THISPROGRAMISMYFAVORITE,并且文件textfile中也相应的存入了这段话。

选择4,文件CodeFile以紧凑格式显示在终端上。

选择5,将已在存中的哈夫曼树以直观的方式〔树或凹入表形式〕显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

选择其他的数字,将出现出错提示,并重新回到选择菜单。

2概要设计

2.1数据构造设计

InitHuffman(HuffmanHfm);//初始化哈夫曼树

Encoding(HuffmanHfm);//翻译短文

Decoding(HuffmanHfm);//反译编码

Print1(HuffmanHfm);//打印文件编码

Print2(HuffmanHfm);//打印哈夫曼树

typedefchar**HuffmanCode;//动态分配数组存储霍夫曼表码表

typedefstruct{

unsignedintweight;

unsignedintparent,lchild,rchild;

}HTNode,*HuffmanTree;//动态分配数组存储霍夫曼树

typedefstruct{

HuffmanTreeHT;

char*c;

intlength;

HuffmanCodeHC;

}Huffman;//分配数组存储字符串及其对应的霍夫曼树

HuffmanHfm;

2.2系统模块设计

3详细设计

#include

#include

#include

#include

#defineNULL0

#defineOK1

#defineERROR0

#defineOVERFLOW-2

#defineMAX_NUM32767

#defineMAX60

typedefchar**HuffmanCode;//动态分配数组存储哈夫曼表码表

typedefstruct{

unsignedintweight;

unsignedintparent,lchild,rchild;

}HTNode,*HuffmanTree;//动态分配数组存储哈夫曼树

typedefstruct{

HuffmanTreeHT;

char*c;

intlength;

HuffmanCodeHC;

}Huffman;//全局构造体变量,来存储字符与代码

/*------------------------------------------寻找权值最小的两个节点-------------------------------------*/

voidSelect(HuffmanTreeHT,intend,int*s1,int*s2)

{

inti;

intmin1=MAX_NUM;

intmin2;

for(i=1;i<=end;i++)/*遍历查找权值最小的结点S1*/

{

if(HT[i].parent==0&&HT[i].weight

{

*s1=i;

min1=HT[i].weight;

}

}

min2=MAX_NUM;

for(i=1;i<=end;i++)/*遍历查找除S1外权值最小的结点S2*/

{

if(HT[i].parent==0&&(*s1!

=i)&&min2>HT[i].weight)

{

*s2=i;

min2=HT[i].weight;

}

}

}

/*------------------------------------对哈夫曼树进展编码-------------------------------------*/

HuffmanHuffmanCoding(HuffmanHfm)

{

inti,n,m,s1,s2,start;

intc,f;

char*cd;

n=Hfm.length;

if(n<=1)returnHfm;

m=2*n-1;

for(i=n+1;i<=m;++i)/*选择HT[1....i-1]中无双亲且权值最小的两个节点,其序号为s1,s2*/

{

Select(Hfm.HT,i-1,&s1,&s2);

Hfm.HT[s1].parent=i;/*修改父亲位置*/

Hfm.HT[s2].parent=i;

Hfm.HT[i].lchild=s1;/*修改孩子位置*/

Hfm.HT[i].rchild=s2;

Hfm.HT[i].weight=Hfm.HT[s1].weight+Hfm.HT[s2].weight;/*父亲结点权值为左右孩子权值之和*/

}

/*从叶子结点到根逆向求每个字符的哈夫曼编码*/

Hfm.HC=(HuffmanCode)malloc((n+1)*sizeof(char*));/*分配n个字符编码的头指针向量*/

cd=(char*)malloc(n*sizeof(char));/*分配求编码的工作空间*/

cd[n-1]='\0';/*编码完毕符*/

for(i=1;i<=n;++i)/*逐个字符求哈夫曼编码*/

{

start=n-1;/*编码完毕符位置*/

for(c=i,f=Hfm.HT[i].parent;f!

=0;c=f,f=Hfm.HT[f].parent)/*从叶子到根逆向求编码*/

{

if(c==Hfm.HT[f].lchild)cd[--start]='0';

elsecd[--start]='1';

}

Hfm.HC[i]=(char*)malloc((n-start)*sizeof(char));

strcpy(Hfm.HC[i],&cd[start]);/*从cd复制编码到Hfm.HC*/

}

free(cd);

returnHfm;

}

/*------------------------------------录入数据函数-------------------------------------*/

HuffmanInputHuffman(HuffmanHfm)

{

inti,n;

printf("\n\n********************录入数据*********************\n");

printf("录入的字符及其权值将保存于:

\hfmTree\\n");

printf("请输入录入字符个数:

");

scanf("%d",&n);

if(n<=1)

{printf("只有一个字符无需编码");

printf("\n");

printf("请输入录入字符个数:

");

scanf("%d",&n);}

Hfm.HT=(HuffmanTree)malloc((2*n)*sizeof(HTNode));

Hfm.c=(char*)malloc((n+1)*sizeof(char));

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

{

printf("请输入字符:

");

scanf("%s",&Hfm.c[i]);

printf("请输入字符权值:

");

scanf("%d",&Hfm.HT[i].weight);

Hfm.HT[i].parent=0;

Hfm.HT[i].lchild=0;

Hfm.HT[i].rchild=0;

}

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

{

Hfm.HT[i].weight=0;

Hfm.HT[i].parent=0;

Hfm.HT[i].lchild=0;

Hfm.HT[i].rchild=0;

}

Hfm.length=n;

returnHfm;

}

/*------------------------------------初始化哈夫曼树-------------------------------------*/

HuffmanInitHuffman(HuffmanHfm)

{

intn,i;

charx;

FILE*fp;

fp=fopen("hfmTree","rt");/*对文件hfmTree以读文本的形式翻开*/

if(fp==NULL)

{

Hfm=InputHuffman(Hfm);/*调用InputHuffman函数,用户输入字符和相应权值存入哈夫曼数中*/

fp=fopen("hfmTree","wt");

fprintf(fp,"%d\n",Hfm.length);

for(i=1;i<=Hfm.length;i++)

fprintf(fp,"%c%d",Hfm.c[i],Hfm.HT[i].weight);

rewind(fp);

}

else

{printf("哈夫曼树已经存在!

\n你是否需要重新初始化哈夫曼树?

('Y'or'N')\n");/*询问是否重新初始化*/

printf("请输入选择:

");

scanf("%s",&x);

if(x=='Y')

{Hfm=InputHuffman(Hfm);/*调用InputHuffman函数,用户输入字符和相应权值存入哈弗曼数中*/

fp=fopen("hfmTree","w+");

fprintf(fp,"%d\n",Hfm.length);

for(i=1;i<=Hfm.length;i++)

fprintf(fp,"%c%d",Hfm.c[i],Hfm.HT[i].weight);

rewind(fp);

}

else

{fscanf(fp,"%d\n",&n);

Hfm.c=(char*)malloc((n+1)*sizeof(char));

Hfm.HT=(HuffmanTree)malloc((2*n)*sizeof(HTNode));

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

fscanf(fp,"%s%d",&Hfm.c[i],&Hfm.HT[i].weight);/*将已经在文件中的字符和其对应的权重输入到Hfm.c[i]和&Hfm.HT[i].weight中*/

for(i=1;i<=n;i++)/*对每个节点初始化*/

{

Hfm.HT[i].parent=0;

Hfm.HT[i].lchild=0;

Hfm.HT[i].rchild=0;

}

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

{

Hfm.HT[i].weight=0;

Hfm.HT[i].parent=0;

Hfm.HT[i].lchild=0;

Hfm.HT[i].rchild=0;

}

Hfm.length=n;

}

}

fclose(fp);

Hfm=HuffmanCoding(Hfm);

returnHfm;

}

/*------------------------------------翻译短文-------------------------------------*/

voidEncoding(HuffmanHfm)/*利用已建好的Huffman树(如不在存,那么从文件hfmTree中读入)对文件ToBeTran中的正文进展编码,然后将结果存入文件CodeFile中。

*/

{

inti=0,j=0,n;

charch[MAX];

FILE*fp,*fw;

n=Hfm.length;

printf("\n\n*******************翻译短文**************************\n\n");

if((fw=fopen("ToBeTran","r+"))==NULL)/*尝试翻开ToBeTran*/

{

printf("\n请输入需要翻译成编码的短文:

");

scanf("%s",ch);

printf("\n");

fp=fopen("CodeFile","wt+");

}

else

{

fscanf(fw,"%s",ch);

fclose(fw);

}

while(ch[j])

{

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

if(ch[j]==Hfm.c[i])

{

printf("%s",Hfm.HC[i]);

fprintf(fp,"%s",Hfm.HC[i]);

break;

}

j++;

}

printf("\n");

rewind(fp);

fclose(fp);

}

/*------------------------------------反译编码-------------------------------------*/

voidDecoding(HuffmanHfm)/*利用已建好的Huffman树将文件CodeFile中的代码进展译码,结果存入文件TextFile中。

*/

{

HuffmanTreep;

inti,n;

intj=0;

chard[500];

charx;

FILE*fp;

n=Hfm.length;

printf("\n\n******************反译************************\n\n");

if((fp=fopen("CodeFile","r+"))==NULL)

{

printf("Pleaseinputthecode:

");

scanf("%s",d);

}

else

{

printf("文件中已经有编码,是否需要更换编码?

('Y'or'N')\n");

printf("请输入选择:

");

scanf("%s",&x);

if(x=='Y')

{

printf("请输入需要反译的新编码:

");

scanf("%s",d);

}

else

{

fscanf(fp,"%s",d);/*将文件中的字符输入到数组d中*/

fclose(fp);

}

}

printf("\n反译后得到的短文为:

");

fp=fopen("TextFile","wt+");/*以写入文件的形式翻开TextFile*/

while(d[j])

{

p=&Hfm.HT[2*n-1];

while(p->lchild||p->rchild)

{

if(d[j]=='0')

{i=p->lchild;p=&Hfm.HT[i];}

else

{i=p->rchild;p=&Hfm.HT[i];}

j++;

}

printf("%c",Hfm.c[i]);

fprintf(fp,"%c",Hfm.c[i]);

}

printf("\n");

fclose(fp);

}

/*------------------------------------打印文件编码-------------------------------------*/

voidPrint1(HuffmanHfm)

{

inti,n;

intm=1;

charch;

FILE*fprint;

n=Hfm.length;

printf("\n\n******************打印文件编码****************\n\n");

fprint=fopen("CodeFile","rb");

while(feof(fprint)==0)

{

ch=fgetc(fprint);

printf("%c",ch);

m++;

if(m%50==0)

printf("\n");

}

printf("\n");

fclose(fprint);

}

/*------------------------------------打印哈夫曼树-------------------------------------*/

voidPrint2(HuffmanHfm)

{

inti,n;

n=Hfm.length;

printf("\n\n******************打印哈夫曼树****************\n\n");

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

{

printf("\n");

printf("Char:

%c\t",Hfm.c[i]);

printf("Weight:

%d\t",Hfm.HT[i].weight);

printf("parent:

%d\t",Hfm.HT[i].parent);

printf("lchild:

%d\t",Hfm.HT[i].lchild);

printf("rchild:

%d\t",Hfm.HT[i].rchild);

printf("Code:

");

puts(Hfm.HC[i]);

}

printf("\n");

}

/*------------------------------------主函数-------------------------------------*/

voidmain()

{

HuffmanHfm;

chark;

while

(1)

{

printf("\n");

printf("〒〒〒〒〒欢送进入哈夫曼编/译码系统:

〒〒〒〒〒\n");

printf("★★★★★★★wele★★★★★★★\n");

printf("\t*【1】录入数据*\n");

printf("\t*【2】翻译短文*\n");

printf("\t*【3】反译编码*\n");

printf("\t*【4】打印文件编码*\n");

printf("\t*【5】打印哈夫曼树*\n");

printf("\t*【0】退出系统*\n");

printf("\n");

printf("请输入你的选择:

");

scanf("%c",&k);

system("cls");

switch(k)

{case'1':

Hfm=InitHuffman(Hfm);getchar();break;

case'2':

Encoding(Hfm);getchar();break;

case'3':

Decoding(Hfm);getchar();break;

case'4':

Print1(Hfm);getchar();break;

case'5':

Print2(Hfm);getchar();break;

case'0':

exit(0);

default:

printf("无效选项!

请重新输入\n");}

}

}

4系统演示

4.1主界面

 

4.2数据录入

4.3翻译短文

 

4.4反译编码

4.5打印文件编码

4.6打印哈夫曼树

 

5运行环境

1,软件环境:

操作系统:

Windows98/XP/Windows7以上版本

2.硬件环境:

1,处理器:

Intel166MX以上

2,存:

32MB

3:

硬盘空间:

2GB

2,开发工具和编程语言

Vc6.0;

用C语言编写;

 

6课程心得总结

我学习数据构造的时间也不短了,其中学习过程中或多或少有些遗漏的知

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

当前位置:首页 > 人文社科 > 法律资料

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

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