哈夫曼编码编译器c语言实训,哈夫曼编码编译器.doc

.

.

课题:哈夫曼编码编译器

设计一个哈夫曼编码/译码系统,对一个文本文件中的字符进行哈夫曼编码,生成编码文件

(压缩文件,后缀名.cod);反过来,可将一个压缩文件译码还原为一个文本文件(.txt)。

功能

(1)输入一个待压缩的英文文本文件,统计文本文件中各字符的个数作为权值,生成哈夫曼树;

(2)将文本文件利用哈夫曼树进行编码,生成压缩文件(后缀名cod)

(3)输入一个待解压的压缩文件名称,并利用相应的哈夫曼树将编码序列译码。

三、程序结构

程序流程图

执行程序

执行程序

选择(0)退出选择(1)编码

选择(0)退出

选择(1)编码

选择(2)译码

选择(2)译码

输入要编码文件

输入要编码文件

输入要译码文件名

输入要译码文件名

编码

编码

译码

译码

保存编码后的文件

保存编码后的文件

保存译码后的文件

保存译码后的文件

文字说明

Main函数:Coding()编码函数

TransCode()译码函数

Coding()编码函数:

clearscreen()清屏函数

Open()打开源码文件

SearchStr()查找字符串中不同的字符及其出现的次数

CreatHFMTree()用每个字符出现的次数作为叶子节点的权值建立哈夫曼树

HFMCode()利用哈夫曼树对每个叶子节点进行编码,存入编码表中

TotalCoding()利用编码表对字符串进行最终编码

Save()保存最终的哈夫曼编码

TransCode()译码函数:

clearscreen()清屏函数

Open()打开编码文件

DeCoding(); //将编码进行解码存入字符串数组中

Save(); //保存译码后的字符串

四、 算法说明

执行界面

可供三个选择

编码

译码

退出

执行(1)选择

需要输入要编译的文件名

需要输出编码保存文件名

选择(1)执行完毕

执行(2)选项

输入要译码的编码文件名并输入保存的文件名

选择(2)执行完毕

执行(0)则退出该程序

五、报告总结

该程序主要采用了哈夫曼编码译码方法,对txt文件进行编译压缩,同时也能对编码后的文件进行解码,程序结构清晰,主干分两大部分:编码部分与解码部分,各部分通过调用函数合理清晰的实现其功能。程序中运用了一些文件的C语言基本操作,例如打开文件open()、保存文件save()函数,但程序上对文件类型的处理还有一些缺点,不能实现文件类型的自动保存,需要输入文件名字和类型。通过这次课程设计,不仅提高了自己的编程能力,还让我知道自己在编程方面的缺点,我以后会更加努力扩大自己的知识面提高自己的编程能力。

#include

#include

#include

#define M 10000 //定义字符串最大长度

#define N 128 //定义叶子节点个数

typedef struct node //定义哈夫曼树节点结构体

{

int weight;

struct node *LChild,*RChild,*Parent; //分别指向该节点的左孩子,右孩子,和双亲节点

struct node *next; //指向建立的哈夫曼树的下一个节点

}HFMNode,*HFMTree;

typedef struct //定义哈夫曼编码的结构体

{

char ch; //存储对应的字符

char code[N+1]; //存储对应字符的编码

int start; //存储编码的起始位置

}CodeNode;

int n; //存储真正叶子节点个数

void clearscreen()

{

system("cls");

}

void Open(char s[]) //打开存放字符或编码的文件,将其存入字符串数组中

{

char name[10];

FILE *fp;

int i=0;

printf("请输入要打开的文件名:");

gets(name); //要打开的文件名

if((fp=fopen(name,"rt"))==NULL)

{

printf("打开失败!\n"); //若打开失败,则直接退出

exit(1);

}

s[i++]=fgetc(fp);

while(s[i-1]!=EOF)

s[i++]=fgetc(fp);

s[i]='\0'; //存取字符串结束

fclose(fp);

}

void Save(char s[]) //保存字符或编码到文件中

{

char name[10];

FILE *fp;

printf("请输入要保存的文件名:");

gets(name);

if((fp=fopen(name,"wt"))==NULL)

{

printf("存储失败!");

exit(1);

}

fputs

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值