好文档 - 专业文书写作范文服务资料分享网站

大数据结构实验报告材料(哈夫曼编码加密文件资料资料资料)

天下 分享 时间: 加入收藏 我要投稿 点赞

实用标准文案

《数据结构》

题目: 班级: 学号: 姓名: 完成时间:任课教师:

精彩文档

实验报告

利用哈夫曼编码给文件或者文字加密

xxxx xxxxxxxxxxx

xxx

2010年12月19日

xxx

实用标准文案

一、 问题描述

用哈夫曼编码,将输入的文字,或者文件中的文字进行编码,并输出加密后的文字。

二、 程序总体结构 显示系统时间 showtime() 主程序 main 给用户提供选择方式 chioce1() 显示界面告诉用户程序名称 show() 打开文件进行加密 openfile()

退出程序 输入电文进行加密 input() 统计输入(文件中)字母的出现频率 CrW(data,w,count)【fcount(alldata,data,count)】 将输入(文件中)的电文创建成哈夫曼树 CrtHuffmantree(ht,w,n) 将输入(文件中)的电文进行哈夫曼编码 CrtHuffmanCode(ht,hc,n) 输出每一个字母所对应的哈夫曼编码 Printf(hc,n,data,alldata,count) 对输入(文件中)的文字进行哈夫曼加密 showall(hc,alldata,count,data,n) 精彩文档

实用标准文案

1、 数据结构

此函数中运用到的数据结构知识就是哈夫曼树的建立以及遍历,建立主要就是每一次选择权值最小的两个数并将其求和,然后用他们的和代替这两个数,再进行求两个最小值,最后构成一个哈夫曼数;遍历是采用从叶子结点开始向根节点确定唯一的路径。

2、 主要函数:

(1)void CrtHuffmantree(HuffmanTree &ht,int w[],int n),功能是建立一个哈夫曼树;

(2)void CrtHuffmanCode(HuffmanTree ht,HuffmanCode hc,int n),功能是计算哈夫曼编码;

(3)void dianwen(int count[],char alldata[]),功能是统计输入电文的字母种类以及频率;

(4)int fcount(char alldata[],char data[],int count[]),功能是统计打开文件中出现的字母的种类以及频率; (5)void showtime(),功能是查看系统当前的时间;

(6)int search(char ch,char data[],int n),查询电文中的每一个字母所对应得哈夫曼编码的下标; (7)void

Printf(HuffmanCode

&hc,int

n,char

data[],char

alldata[],int count[]),功能是输出每一个字母所对应的哈夫曼编码; (8)void showall(HuffmanCode hc,char alldata[],int count[],char data[],int n),功能是输出经过加密后的密文。

三、 源代码

#include #include #include #include #define N 27 大叶子结点个数

精彩文档

#define M 2*N-1 typedef struct 义哈夫曼结构体 {

//定义最

int weight; int parent;

//定

实用标准文案

int LChild; int RChild;

}HTNode,HuffmanTree[M+1]; //0号单元不用

typedef char* HuffmanCode[N+1]; //存储哈夫曼编码串的头指

//调用系统的时间 void showtime() {

time_t t; tm *tp; t=time(NULL); tp=localtime(&t);

printf(\\

tm_mon+1,tp->

tm_mday,tp-> tm_year+1900); printf( \%d:%d:%d\\n \tm_sec); }

//**************计算电文中各个英文字母出现的次数*******************

void dianwen(int count[],char alldata[]) {

int n,i;

printf(\〓〓〓〓〓〓〓〓〓〓

精彩文档

〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\

printf(\请输入电文:\\n\ fflush(stdin);

for(i=0;i<27;i++)//将数组计数器初始化 count[i]=0; printf(\ alldata[0]=getchar(); while(alldata[count[0]]!='\\n') {

n=(alldata[count[0]]-'a')+1; count[n]++;

count[0]++;

//所有字母的总个数

alldata[count[0]]=getchar(); } }

void CrW(char data[],int w[],int count[]) //存储数据以及权值信息 {

int i,j; j=0;

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

实用标准文案

{ if(count[i]!=0) {

j++;

data[j]=char(i-1+'a'); w[j]=count[i]; }

} w[0]=j;

//用于存储字母出现的种类个数 }

void select(HuffmanTree &ht,int n,int &s1,int &s2)

//查

找一串数字中的两个最小值 {

int i,t; s1=0; s2=0;

ht[0].weight=65535; for(i=1;i<=n;i++) {

if(ht[i].weight

s1=i;

if(ht[t].weight

精彩文档

) { s2=t;

}

}

else

if(ht[i].weight

s2=i;

else;

} }

void CrtHuffmantree(HuffmanTree &ht,int w[],int n)

//创

建哈夫曼树 {

int i,m; int s1,s2;

for(i=1;i<=n;i++) //初始化叶子结点 { ht[i].weight=w[i]; ht[i].parent=0; ht[i].LChild=0; ht[i].RChild=0;

}

m=2*n-1;

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

始化其他结点 {

2iimp6s3vy8mpoj7ocb09o8y29wtcx00z2v
领取福利

微信扫码领取福利

微信扫码分享