数据结构哈夫曼编码.doc_第1页
数据结构哈夫曼编码.doc_第2页
数据结构哈夫曼编码.doc_第3页
数据结构哈夫曼编码.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Main.c文件如下#include #include #include #include Haffman.h#define MaxBit 100void main(void) Code *d; int i,j,n=26,m,weight26=0; char c,a=97; FILE *fp; /文本文件指针 if(fp=fopen(data.txt,r)=NULL) printf(无法打开此文件n); exit(0); /中止程序 printf(待压缩的英文文本文件为:n); while(!feof(fp) /当扫描文件内容没有结束时 /读取字符并统计每个字符次数 c=fgetc(fp);putchar(c); if(c=a|c=z); c=c-32; for (i=65;i=90;i+) if(c=i) weighti-65+ ; fclose(fp); HaffNode *myHaffTree=(HaffNode *)malloc(sizeof(HaffNode)*(2*n-1); Code *myHaffCode=(Code *)malloc(sizeof(Code)*n); Haffman(weight,n,myHaffTree); HaffmanCode(myHaffTree,n,myHaffCode); for(m=0;mn;m+) printf(nzimu=%c Weight=%d Code=,a+,myHaffCodem.weight); for(j=myHaffCodem.start;jn;j+) printf(%d,myHaffCodem.bitj); printf(n); 头文件Huffman.h如下#ifndef Haffman_H_INCLUDED#define Haffman_H_INCLUDED#define MaxN 300#define MaxValue 10000typedef struct int weight; /权值 int flag; /标记 int parent; /双亲结点下标 int leftChild; /左孩子下标 int rightChild; /右孩子下标HaffNode; /哈夫曼树的结点结构typedef struct int bitMaxN; /数组 int start; /编码的起始下标 int weight; /字符的权值Code; /哈弗曼编码的结构void Haffman(int weight,int n,HaffNode haffTree)/建立叶节点个数为n,权值数组为weight的哈弗曼树haffTree int i,j,m1,m2,x1,x2; /哈夫曼树haffTree初始化,n个叶节点的二叉树共有2n-1个结点 for(i=0;i2*n-1;i+) if(in) haffTreei.weight=weighti; else haffTreei.weight=0; haffTreei.parent=-1; haffTreei.flag=0; haffTreei.leftChild=-1; haffTreei.rightChild=-1; /构造哈弗曼树的n-1个非叶节点 for(i=0;in-1;i+) m1=m2=MaxValue; x1=x2=0; for(j=0;jn+i;j+) /找出权值最小和次小的子树 if(haffTreej.weightm1) & (haffTreej.flag=0) m2=m1; x2=x1; m1=haffTreej.weight; x1=j; else if(haffTreej.weightm2) & (haffTreej.flag=0) m2=haffTreej.weight; x2=j; /将找出两棵权值最小和次小的子树合并为一棵子树 haffTreex1.parent=n+i; haffTreex2.parent=n+i; haffTreex1.flag=1; haffTreex2.flag=1; haffTreen+i.weight=haffTreex1.weight+haffTreex2.weight; haffTreen+i.leftChild= x1; haffTreen+i.rightChild=x2; void HaffmanCode(HaffNode haffTree,int n,Code haffCode)/由n个结点的哈夫曼树构造哈弗曼编码 Code *cd=(Code *)malloc(sizeof(Code); int i,j,child,parent; /求n个叶节点的哈弗曼编码 for(i=0;istart=n-1; /不等长编码的最后一位n-1 cd-weight=haffTreei.weight; /取得编码对应权值 child=i; parent=haffTreechild.parent; /由叶节点向上直到根节点 while(parent!=-1) if(haffTreeparent.leftChild=child) cd-bitcd-start=0; /左孩子分支编码0 else cd-bitcd-start=1; /左孩子分支编码1 cd-start-; child=parent; parent=haffTreechild.parent; for(j=cd-start+1;j

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论