欢迎来到天天文库
浏览记录
ID:16132842
大小:27.00 KB
页数:4页
时间:2018-08-08
《数据结构哈夫曼编码》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Main.c文件如下#include#include#include#include"Haffman.h"#defineMaxBit100voidmain(void){Code*d;inti,j,n=26,m,weight[26]={0};charc,a=97;FILE*fp;//文本文件指针if((fp=fopen("data.txt","r"))==NULL){printf("无法打开此文件");exit(0);//中止程序}printf("待压
2、缩的英文文本文件为:");while(!feof(fp))//当扫描文件内容没有结束时{//读取字符并统计每个字符次数c=fgetc(fp);putchar(c);if(c>='a'
3、
4、c<='z');c=c-32;for(i=65;i<=90;i++)if(c==i)weight[i-65]++;}fclose(fp);HaffNode*myHaffTree=(HaffNode*)malloc(sizeof(HaffNode)*(2*n-1));Code*myHaffCode=(Code*)malloc(
5、sizeof(Code)*n);Haffman(weight,n,myHaffTree);HaffmanCode(myHaffTree,n,myHaffCode);for(m=0;m6、ndefHaffman_H_INCLUDED#defineHaffman_H_INCLUDED#defineMaxN300#defineMaxValue10000typedefstruct{intweight;//权值intflag;//标记intparent;//双亲结点下标intleftChild;//左孩子下标intrightChild;//右孩子下标}HaffNode;//哈夫曼树的结点结构typedefstruct{intbit[MaxN];//数组intstart;//编码的起始下标intweigh7、t;//字符的权值}Code;//哈弗曼编码的结构voidHaffman(intweight[],intn,HaffNodehaffTree[])//建立叶节点个数为n,权值数组为weight的哈弗曼树haffTree{inti,j,m1,m2,x1,x2;//哈夫曼树haffTree初始化,n个叶节点的二叉树共有2n-1个结点for(i=0;i<2*n-1;i++){if(i8、.parent=-1;haffTree[i].flag=0;haffTree[i].leftChild=-1;haffTree[i].rightChild=-1;}//构造哈弗曼树的n-1个非叶节点for(i=0;i9、;x1=j;}elseif((haffTree[j].weight10、eight;haffTree[n+i].leftChild=x1;haffTree[n+i].rightChild=x2;}}voidHaffmanCode(HaffNodehaffTree[],intn,CodehaffCode[])//由n个结点的哈夫曼树构造哈弗曼编码{Code*cd=(Code*)malloc(sizeof(Code));inti,j,child,parent;
6、ndefHaffman_H_INCLUDED#defineHaffman_H_INCLUDED#defineMaxN300#defineMaxValue10000typedefstruct{intweight;//权值intflag;//标记intparent;//双亲结点下标intleftChild;//左孩子下标intrightChild;//右孩子下标}HaffNode;//哈夫曼树的结点结构typedefstruct{intbit[MaxN];//数组intstart;//编码的起始下标intweigh
7、t;//字符的权值}Code;//哈弗曼编码的结构voidHaffman(intweight[],intn,HaffNodehaffTree[])//建立叶节点个数为n,权值数组为weight的哈弗曼树haffTree{inti,j,m1,m2,x1,x2;//哈夫曼树haffTree初始化,n个叶节点的二叉树共有2n-1个结点for(i=0;i<2*n-1;i++){if(i8、.parent=-1;haffTree[i].flag=0;haffTree[i].leftChild=-1;haffTree[i].rightChild=-1;}//构造哈弗曼树的n-1个非叶节点for(i=0;i9、;x1=j;}elseif((haffTree[j].weight10、eight;haffTree[n+i].leftChild=x1;haffTree[n+i].rightChild=x2;}}voidHaffmanCode(HaffNodehaffTree[],intn,CodehaffCode[])//由n个结点的哈夫曼树构造哈弗曼编码{Code*cd=(Code*)malloc(sizeof(Code));inti,j,child,parent;
8、.parent=-1;haffTree[i].flag=0;haffTree[i].leftChild=-1;haffTree[i].rightChild=-1;}//构造哈弗曼树的n-1个非叶节点for(i=0;i9、;x1=j;}elseif((haffTree[j].weight10、eight;haffTree[n+i].leftChild=x1;haffTree[n+i].rightChild=x2;}}voidHaffmanCode(HaffNodehaffTree[],intn,CodehaffCode[])//由n个结点的哈夫曼树构造哈弗曼编码{Code*cd=(Code*)malloc(sizeof(Code));inti,j,child,parent;
9、;x1=j;}elseif((haffTree[j].weight10、eight;haffTree[n+i].leftChild=x1;haffTree[n+i].rightChild=x2;}}voidHaffmanCode(HaffNodehaffTree[],intn,CodehaffCode[])//由n个结点的哈夫曼树构造哈弗曼编码{Code*cd=(Code*)malloc(sizeof(Code));inti,j,child,parent;
10、eight;haffTree[n+i].leftChild=x1;haffTree[n+i].rightChild=x2;}}voidHaffmanCode(HaffNodehaffTree[],intn,CodehaffCode[])//由n个结点的哈夫曼树构造哈弗曼编码{Code*cd=(Code*)malloc(sizeof(Code));inti,j,child,parent;
此文档下载收益归作者所有