哈夫曼编码与解码c语言
#include "stdio.h" /*I/O
函数
excel方差函数excelsd函数已知函数 2 f x m x mx m 2 1 4 2拉格朗日函数pdf函数公式下载
*/
#include"stdlib.h" /*其他库函数声明*/
int num;/*记录结点数*/
int codenum=0;/*已经获得的编码个数*/
char filename[20]=""; /*存储文件名*/
typedef struct /*哈夫曼结点存储结构*/ {
char ch; /*结点字符*/
int w; /*结点权值*/
int lchild,rchild; /*左右孩子的数组下标*/
}HafuNode,*HafuTree; HafuTree ht;/*声明一个指向树结点到指针*/ typedef struct
{
char ch; /*叶子结点字符*/
char codestr[20]; /*字符编码*/
}HafuCode;
HafuCode code[27];/*用于存放对应字符到哈夫曼编码*/ void InitHafuArry()
{ /*导入文件计算权值,生成只含有叶子结点的HafuNode数组*/
int j,i,k;
HafuNode tmpht;
FILE *fp; /*定义一指向打开文件的指针*/
char ch;/*用于存储一个字母*/
char location[30]="D:\\";
ht=(HafuTree)malloc(53*sizeof(HafuNode)); /*为哈夫曼数分配内存空间*/
if(ht==NULL) return ;
for(i=0;i<53;i++) /*初始化所以的数据单元,每个单元自成一棵树*/
{
ht[i].w=0; /*权值初始化为0*/
ht[i].lchild=ht[i].rchild=-1; /*左右子为空*/
}
num=0;
printf("File name:");
scanf("%s",filename);
strcat(location,filename);
fp=fopen(location,"r");
if(!fp) /*返回1时即存在文件*/
{
printf("Open Error");
return;
}
while(!feof(fp))/*没到结尾时返回0*/
{
ch=fgetc(fp);
if(ch==' '||ch<='z'&&ch>='a'||ch<='Z'&&ch>='A')
{
printf("%c",ch);
if(ch==' ') ch='#';
for(j=0;j
k;j--) /*将新结点插入有序数组中*/
{
if(ht[j].w>hfnode.w)
{
ht[j+1]=ht[j];
}
else break;
}
ht[j]=hfnode;
root=j;/*一直跟随新生成的结点,最后新生成的结点为根结点*/
}
return root;
}
void GetHafuCode(HafuTree ht,int root,char *codestr)
{ /*ht是哈夫曼树,root是根结点下标,codestr是来暂时存放叶子结点编码的,一开始为空
*/
FILE *out;
int len,i;
FILE *fp; /*定义一指向打开文件的指针*/
char ch;/*用于存储一个字母*/
char location[30]="D:\\";
if(ht[root].lchild==-1)
{/*遇到递归终点是叶子结点记录叶子结点的哈夫曼编码*/
code[codenum].ch=ht[root].ch;
strcpy(code[codenum].codestr,codestr);
codenum++;
}
else /*不是终点则继续递归*/
{
len=strlen(codestr);
codestr[len]='0'; /*左分支编码是0*/
codestr[len+1]=0; /*向左孩子递归之前调整编码序列末尾加0,相当于加了个‘\0’
(null)其十进制值是0,以便下次循环时添加字符,否则会被覆盖掉*/
GetHafuCode(ht,ht[root].lchild,codestr); /*向左递归*/
len=strlen(codestr);
codestr[len-1]='1';/*右分支编码为1,想右递归之前末尾编码0改为1*/
GetHafuCode(ht,ht[root].rchild,codestr); /*向右递归*/
len=strlen(codestr);
codestr[len-1]=0; /*左右孩子递归返回后,删除编码标记末尾*/
}
strcat(location,filename);
fp=fopen(location,"r");
if(!fp) /*返回1时即存在文件*/
{
printf("Open Error");
return;
}
out=fopen("D:\\code.txt","w+") ;
if(!out)
{
/*printf("Write Error"); */
return;
}
while(!feof(fp))/*没到结尾时返回0*/
{
ch=fgetc(fp); /*再打开源文件,对照哈夫曼编码译成编码*/
if(ch==' '||ch<='z'&&ch>='a'||ch<='Z'&&ch>='A')
{ if(ch==' ') ch='#'; /*如果是空格就用#号代替*/
for(i=0;i='0'&&ch<='1')/*将编码过滤出来*/
{
printf("%c",ch); /*将密文输出显示*/
}
}
printf("\n");
rewind(fp2); /*将文件指针位置定位在开头*/
while(!feof(fp2))/*没到结尾时返回0*/
{
ch=fgetc(fp2);
if(ch>='0'&&ch<='1')/*将编码过滤出来*/
{
if(ch=='0') /*如果为0则当前结点向左走*/
{
if(ht[curr].lchild!=-1)
{
curr=ht[curr].lchild;/*若有左子则去左子*/
}
else
{
curr=root; /*没有则返回根结点*/
}
}
if(ch=='1') /*如果为1则当前结点向右走*/
{
if(ht[curr].rchild!=-1)
{
curr=ht[curr].rchild;/*若有右子则去右子*/
}
else
{
curr=root; /*没有则返回根结点*/
}
}
if(ht[curr].lchild==-1&&ht[curr].rchild==-1)/*若为叶子结点则打印输出*/
{
printf("%c",ht[curr].ch=='#'?' ':ht[curr].ch);
curr=root; /*回到根结点继续索引*/
}
}
}
fclose(fp2);
}
void main()
{ int root;
int i;
char codestr[20]="";
int control;
/*显示菜单可选择编码、译码还是退出*/
printf("================Menu==============\n");
printf("chose 1:encode\n");
printf("chose 2:decode\n");
printf("chose 3:exit\n");
scanf("%d",&control);
while(control!=3) /*只有没有选择退出就一直循环*/
{
if(control==1) /*选择编码选项*/
{
FILE *output;
char ch;
InitHafuArry(); /*初始化结点*/
root=CreateHafuman(ht); /*造一棵哈夫曼树*/
GetHafuCode(ht,root,codestr);/*根据哈夫曼树将明文译成密码*/
printf("Code:");
output=fopen("D:\\CODE.TXT","r");
if(!output) /*返回1时即存在文件*/
{
printf("Open Error3");
continue;
}
while(!feof(output))/*没到结尾时返回0*/
{
ch=fgetc(output);
if(ch>='0'&&ch<='1')/*将编码过滤出来*/
{
printf("%c",ch); /*将密文输出显示*/
}
}
fclose(output);/*将打开文件关闭*/
}
if(control==2) /*如果选择译码,则调用译码函数*/
{
decodeHafuCode(ht,root);
}
if(control==3) /*如果选择3则退出程序*/
{
exit(0);
}
/*若没有退出则继续打印菜单提示供选择*/
printf("\n\n================Menu==============\n");
printf("chose 1:encode\n");
printf("chose 2:decode\n");
printf("chose 3:exit\n");getch();
scanf("%d",&control);
}
}
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
• 【唯美句子】 走累的时候,我就到升国旗哪里的一角台阶坐下,双手抚膝,再闭眼,
让心灵受到阳光的洗涤。懒洋洋的幸福。
顶 3 收藏 2
• 【唯美句子】 一个人踮着脚尖,在窄窄的跑道白线上走,走到很远的地方又走回来。
阳光很好,温暖,柔和。漫天的安静。
顶 7 收藏 7
• 【唯美句子】 清风飘然,秋水缓淌。一丝云起,一片叶落,剔透生命的空灵。轻轻用手触摸,就点碎了河面的脸。落叶舞步婀娜不肯去,是眷恋,是装点,瞬间回眸,点亮了生命精彩。
顶 11 收藏 9
• 【唯美句子】 几只从南方归来的燕子,轻盈的飞来飞去,“几处早莺争暖树,谁家新燕啄春泥,”其乐融融的山林气息,与世无争的世外桃源,让人心旷神怡。 顶 0 收藏 2
• 【唯美句子】 流年清浅,岁月轮转,或许是冬天太过漫长,当一夜春风吹开万里柳时,心情也似乎开朗了许多,在一个风轻云淡的早晨,踏着初春的阳光,漫步在碧柳垂青的小河边,看小河的流水因为解开了冰冻而欢快的流淌, 清澈见底的的河水,可以数得清河底的鹅软石,偶尔掠过水面的水鸟,让小河荡起一层层的涟漪。河岸换上绿色的新装,刚刚睡醒的各种各样的花花草草,悄悄的露出了嫩芽,这儿一丛,那儿一簇,好像是交头接耳的议论着些什么,又好象是在偷偷地说着悄悄话。
顶 3 收藏 4
• 【唯美句子】 喜欢海子写的面朝大海春暖花开,不仅仅是因为我喜欢看海,还喜欢诗人笔下的意境,每当夜深人静时,放一曲纯音乐,品一盏茶,在脑海中搜寻诗中的恬淡闲适。在春暖花开时,身着一身素衣,站在清风拂柳,蝶舞翩跹的百花丛中,轻吹一叶竖笛,放眼碧波万里,海鸥,沙滩,还有扬帆在落日下的古船,在心旷神怡中,做一帘红尘的幽梦。
顶 0 收藏 2
• 【唯美句子】 繁华如三千东流水,你只在乎闲云野鹤般的采菊东篱、身心自由,置身置灵魂于旷野,高声吟唱着属于自己的歌,悠悠然永远地成为一个真真正正的淡泊名利、鄙弃功名利禄的隐者。
顶 1 收藏 3
• 【唯美句子】 世俗名利和青山绿水之间,你选择了淡泊明志,持竿垂钓碧泉绿潭;权力富贵和草舍茅庐之间,你选择了宁静致远,晓梦翩跹姹紫嫣红。
顶 2 收藏 3
• 【唯美句子】 那是一株清香的无名花,我看到了它在春风夏雨中风姿绰约的模样,可突如其来的秋雨,无情的打落了它美丽的花瓣,看着它在空谷中独自凋零,我莫名其妙的心痛,像针椎一样的痛。秋雨,你为何如此残忍,为何不懂得怜香惜玉,我伸出颤抖的双手,将散落在泥土里的花瓣捧在手心。
顶 4 收藏 5
• 【唯美句子】 滴答滴答,疏疏落落的秋雨,赶着时间的脚步,哗啦啦的下起来。听着雨水轻轻地敲击着微薄的玻璃窗,不知不觉,我像是被催眠了一样,渐渐的进入了梦乡。 顶 3 收藏 5
• 【唯美句子】 在这极致的悲伤里,我看到了世间最美的爱,可谁又能明白,此刻的我是悲伤还是欢喜,也许只有那拨动我心弦的秋季,才知道潜藏在我心中的眼泪。 顶 4 收藏 3
• 【唯美句子】 看着此情此景,我细细地聆听。像是听到了落叶的呢喃,秋风的柔软,在这极短的瞬间,他们一起诉说着最美的爱恋,演绎着永恒的痴缠。当落叶安详的躺在大地,露出幸福的模样,你看,它多像一个进入梦乡的孩子。突然发现,秋风并非是想象中的刽子手,原来它只是在叶子生命的最后一刻,让它体会到爱的缠绵,飞翔的滋味。
顶 1 收藏 1
• 【唯美句子】 很感谢那些耐心回答我的人,公交上那个姐姐,还有那位大叔,我不知道他们是不是本地人,但我们遇到的一个交警协管,一位头发花白的大姐,她是上海本地人,很和善,并不像有些人说的上海人很排外。事实上,什么都不是绝对的。 顶 2 收藏 0
• 【唯美句子】 我嗅到浓郁的香奈尔,却也被那种陌生呛了一鼻。也许,我却不知道,那时的感受了。那里没有那么美好,没有安全感,归属感。我想要的自由呢,不完全地体验到了。
顶 2 收藏 1
• 【唯美句子】 那些繁华的都市,车水马龙,灯红酒绿,流光溢彩,却充斥着一种悲哀,浮夸。我看到各种奢华,却也看到各种卑微,我看到友善亲和,也看到暴躁粗鲁,我看到金光熠
• 【优美语句】 踏过一片海,用博识的学问激起片片微澜;采过一丛花,正在聪慧的碰碰外送来缕缕清喷鼻;无过一个梦,决定从那里启程。
顶 0 收藏 0
• 【优美语句】 人生如一本
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
,应该多一些精彩的细节,少一些乏味的字眼;人生如一支歌,应该多一些昂扬的旋律,少一些忧伤的音符;人生如一幅画,应该多一些亮丽的色彩,少一些灰暗的色调。
顶 0 收藏 0
• 【优美语句】 母爱是一滴甘露,亲吻干涸的泥土,它用细雨的温情,用钻石的坚毅,期待着闪着碎光的泥土的肥沃;母爱不是人生中的一个凝固点,而是一条流动的河,这条河造就了我们生命中美丽的情感之景。
顶 0 收藏 0
【优美语句】 生活如海,宽容作舟,泛舟于海,方知海之宽阔;生活如山,宽容为径,•
循径登山,方知山之高大;生活如歌,宽容是曲,和曲而歌,方知歌之动听。 顶 0 收藏 0
• 【优美语句】 母爱就是一幅山水画,洗去铅华雕饰,留下清新自然;母爱就象一首深情的歌,婉转悠扬,轻吟浅唱;母爱就是一阵和煦的风,吹去朔雪纷飞,带来春光无限。 顶 0 收藏 0
• 【优美语句】 努力奋斗,天空依旧美丽,梦想仍然纯真,放飞自我,勇敢地飞翔于梦想的天空,相信自己一定做得更好。
顶 0 收藏 0
• 【优美语句】 品味生活,完善人性。存在就是机会,思考才能提高。人需要不断打碎自己,更应该重新组装自己。
顶 0 收藏 0
• 【优美语句】 母爱是一缕阳光,让你的心灵即使在寒冷的冬天也能感到温暖如春;母爱是一泓清泉,让你的情感即使蒙上岁月的风尘依然纯洁明净。
顶 0 收藏 0
• 【优美语句】 母爱是温暖心灵的太阳;母爱是滋润心灵的雨露;母爱是灌溉心灵的沃土;母爱是美化心灵的彩虹。
顶 0 收藏 0
• 【优美语句】 一轮金色的光圈印在海面,夕阳将最后的辉煌撒向了大海,海平面波光潋滟,金光闪闪,夕阳下的海水让最后一丝蓝也带着感动。温和的海水轻轻地拍打着我的脚踝,我张开双臂拥抱最温馨的时刻„„我爱大海宽广的胸怀,无论多大的风浪,她都可
以揽入怀中;无论多少风雨,都无法将她击垮;无论多少河流,她都可以容纳;我愿做一
只填海的燕,填平她的波涛翻滚,填平她的汹涌愤怒,只留下平静、柔和的海面。