欢迎来到天天文库
浏览记录
ID:57092084
大小:28.00 KB
页数:10页
时间:2020-08-02
《哈夫曼编码与解码C语言知识讲解.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、哈夫曼编码与解码C语言精品文档#include"stdio.h"/*I/O函数*/#include"stdlib.h"/*其他库函数声明*/intnum;/*记录结点数*/intcodenum=0;/*已经获得的编码个数*/charfilename[20]="";/*存储文件名*/typedefstruct/*哈夫曼结点存储结构*/{charch;/*结点字符*/intw;/*结点权值*/intlchild,rchild;/*左右孩子的数组下标*/}HafuNode,*HafuTree;HafuTreeht;/*
2、声明一个指向树结点到指针*/typedefstruct{charch;/*叶子结点字符*/charcodestr[20];/*字符编码*/}HafuCode;HafuCodecode[27];/*用于存放对应字符到哈夫曼编码*/voidInitHafuArry(){/*导入文件计算权值,生成只含有叶子结点的HafuNode数组*/intj,i,k;HafuNodetmpht;FILE*fp;/*定义一指向打开文件的指针*/charch;/*用于存储一个字母*/charlocation[30]="D:\";ht=
3、(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("Filename:");scanf("%s",filename);strcat(location,
4、filename);fp=fopen(location,"r");if(!fp)/*返回1时即存在文件*/{printf("OpenError");return;}while(!feof(fp))/*没到结尾时返回0*/{ch=fgetc(fp);if(ch==''
5、
6、ch<='z'&&ch>='a'
7、
8、ch<='Z'&&ch>='A'){printf("%c",ch);if(ch=='')ch='#';for(j=0;j9、*找到新字符*/{ht[num].ch=ch;/*将新字符存入并将权值加1*/ht[num].w++;num++;}else{ht[j].w++;/*将已有字符权值加1*/}收集于网络,如有侵权请联系管理员删除精品文档}}fclose(fp);printf("");for(i=0;i10、(k!=i)/*如果权值最小的不是第i个元素则交换位置,将小的放到前面*/{tmpht=ht[i];ht[i]=ht[k];ht[k]=tmpht;}}}intCreateHafuman(HafuTreeht){/*在数组ht中生成哈夫曼数,返回根节点下标*/inti,k,j,root;HafuNodehfnode;codenum=0;for(i=0;i11、.w;hfnode.lchild=k-1;hfnode.rchild=k;for(j=num+i;j>k;j--)/*将新结点插入有序数组中*/{if(ht[j].w>hfnode.w){收集于网络,如有侵权请联系管理员删除精品文档ht[j+1]=ht[j];}elsebreak;}ht[j]=hfnode;root=j;/*一直跟随新生成的结点,最后新生成的结点为根结点*/}returnroot;}voidGetHafuCode(HafuTreeht,introot,char*codestr){/*ht是哈夫曼12、树,root是根结点下标,codestr是来暂时存放叶子结点编码的,一开始为空*/FILE*out;intlen,i;FILE*fp;/*定义一指向打开文件的指针*/charch;/*用于存储一个字母*/charlocation[30]="D:\";if(ht[root].lchild==-1){/*遇到递归终点是叶子结点记录叶子结点的哈夫曼编码*/code[coden
9、*找到新字符*/{ht[num].ch=ch;/*将新字符存入并将权值加1*/ht[num].w++;num++;}else{ht[j].w++;/*将已有字符权值加1*/}收集于网络,如有侵权请联系管理员删除精品文档}}fclose(fp);printf("");for(i=0;i10、(k!=i)/*如果权值最小的不是第i个元素则交换位置,将小的放到前面*/{tmpht=ht[i];ht[i]=ht[k];ht[k]=tmpht;}}}intCreateHafuman(HafuTreeht){/*在数组ht中生成哈夫曼数,返回根节点下标*/inti,k,j,root;HafuNodehfnode;codenum=0;for(i=0;i11、.w;hfnode.lchild=k-1;hfnode.rchild=k;for(j=num+i;j>k;j--)/*将新结点插入有序数组中*/{if(ht[j].w>hfnode.w){收集于网络,如有侵权请联系管理员删除精品文档ht[j+1]=ht[j];}elsebreak;}ht[j]=hfnode;root=j;/*一直跟随新生成的结点,最后新生成的结点为根结点*/}returnroot;}voidGetHafuCode(HafuTreeht,introot,char*codestr){/*ht是哈夫曼12、树,root是根结点下标,codestr是来暂时存放叶子结点编码的,一开始为空*/FILE*out;intlen,i;FILE*fp;/*定义一指向打开文件的指针*/charch;/*用于存储一个字母*/charlocation[30]="D:\";if(ht[root].lchild==-1){/*遇到递归终点是叶子结点记录叶子结点的哈夫曼编码*/code[coden
10、(k!=i)/*如果权值最小的不是第i个元素则交换位置,将小的放到前面*/{tmpht=ht[i];ht[i]=ht[k];ht[k]=tmpht;}}}intCreateHafuman(HafuTreeht){/*在数组ht中生成哈夫曼数,返回根节点下标*/inti,k,j,root;HafuNodehfnode;codenum=0;for(i=0;i11、.w;hfnode.lchild=k-1;hfnode.rchild=k;for(j=num+i;j>k;j--)/*将新结点插入有序数组中*/{if(ht[j].w>hfnode.w){收集于网络,如有侵权请联系管理员删除精品文档ht[j+1]=ht[j];}elsebreak;}ht[j]=hfnode;root=j;/*一直跟随新生成的结点,最后新生成的结点为根结点*/}returnroot;}voidGetHafuCode(HafuTreeht,introot,char*codestr){/*ht是哈夫曼12、树,root是根结点下标,codestr是来暂时存放叶子结点编码的,一开始为空*/FILE*out;intlen,i;FILE*fp;/*定义一指向打开文件的指针*/charch;/*用于存储一个字母*/charlocation[30]="D:\";if(ht[root].lchild==-1){/*遇到递归终点是叶子结点记录叶子结点的哈夫曼编码*/code[coden
11、.w;hfnode.lchild=k-1;hfnode.rchild=k;for(j=num+i;j>k;j--)/*将新结点插入有序数组中*/{if(ht[j].w>hfnode.w){收集于网络,如有侵权请联系管理员删除精品文档ht[j+1]=ht[j];}elsebreak;}ht[j]=hfnode;root=j;/*一直跟随新生成的结点,最后新生成的结点为根结点*/}returnroot;}voidGetHafuCode(HafuTreeht,introot,char*codestr){/*ht是哈夫曼
12、树,root是根结点下标,codestr是来暂时存放叶子结点编码的,一开始为空*/FILE*out;intlen,i;FILE*fp;/*定义一指向打开文件的指针*/charch;/*用于存储一个字母*/charlocation[30]="D:\";if(ht[root].lchild==-1){/*遇到递归终点是叶子结点记录叶子结点的哈夫曼编码*/code[coden
此文档下载收益归作者所有