已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/* * * * * * * * * * * * * * * * * * * * * * * */哈夫曼树的构造哈夫曼树,哈夫曼编码 */* * * * * * * * * * * * * * * * * * * * * * * *#include #include #include #include #include typedef structunsigned int weight; /结点权值 unsigned int parent,lchild,rchild; /结点的父指针,左右孩子指针HTNode,*HuffmanTree; /动态分配数组存储哈夫曼树typedef char *HuffmanCode; /动态分配数组存储哈夫曼编码表void CreateHuffmanTree(HuffmanTree &,unsigned int*,int ); /生成一棵哈夫曼树void HuffmanCoding(HuffmanTree,HuffmanCode &,int ); /对哈夫曼树进行编码void PrintHuffmanCode(HuffmanCode,unsigned int*,int); /显示哈夫曼编码void Select(HuffmanTree,int,int&,int&); /在数组中寻找权值最小的两个结点void main()HuffmanTree HT; /哈夫曼树HT HuffmanCode HC; /哈夫曼编码表HC int n,i; /n是哈夫曼树叶子结点数 unsigned int *w; /w存放叶子结点权值 char j=y; textbackground(3); /设定屏幕颜色 textcolor(15); clrscr(); /程序解说 printf(本程序将演示构造哈夫曼树.n); printf(首先输入叶子结点数目.n例如:8n); printf(然后输入每个叶子结点的权值.n); printf(例如:5 29 7 8 14 23 3 11n); printf(程序会构造一棵哈夫曼树并显示哈夫曼编码.n); printf( 5-0110n 29-10n 7-1110n 8-1111n 14-110n); printf( 23-00n 3-0111n 11-010n); while(j!=N&j!=n) printf(请输入叶子结点数目:); scanf(%d,&n); /输入叶子结点数 if(n=1) printf(该数不合理!n);continue; w=(unsigned int*)malloc(n*sizeof(unsigned int); /开辟空间存放权值 printf(请输入各叶子结点的权值:n); for(i=0;in;i+) scanf(%d,&wi); /输入各叶子结点权值 CreateHuffmanTree(HT,w,n); /生成哈夫曼树 HuffmanCoding(HT,HC,n); /进行哈夫曼编码 PrintHuffmanCode(HC,w,n); /显示哈夫曼编码 printf(哈夫曼树构造完毕,还要继续吗?(Y/N); scanf( %c,&j); void CreateHuffmanTree(HuffmanTree &HT,unsigned int *w,int n)/w存放n个结点的权值,将构造一棵哈夫曼树HT int i,m; int s1,s2; HuffmanTree p; if(n=1) return; m=2*n-1; /n个叶子结点的哈夫曼树,有2*n-1个结点 HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode); /开辟2*n各结点空间,0号单元不用 for(p=HT+1,i=1;iweight=*w; p-parent=0; p-lchild=0; p-rchild=0; for(;iweight=0; p-parent=0; p-lchild=0; p-rchild=0; for(i=n+1;i=m;+i) /建哈夫曼树 Select(HT,i-1,s1,s2); /从HT1.i-1中选择parent为0且weight最小的两个结点,其序号分别为s1和s2 HTs1.parent=i; HTs2.parent=i; /修改s1和s2结点的父指针parent HTi.lchild=s1; HTi.rchild=s2; /修改i结点的左右孩子指针 HTi.weight=HTs1.weight+HTs2.weight; /修改权值 void HuffmanCoding(HuffmanTree HT,HuffmanCode &HC,int n)/将有n个叶子结点的哈夫曼树HT进行编码, 所编的码存放在HC中 /方法是从叶子到根逆向求每个叶子结点的哈夫曼编码 int i,c,f,start; char *cd; HC=(HuffmanCode)malloc(n+1)*sizeof(char *); /分配n个编码的头指针向量 cd=(char *)malloc(n*sizeof(char); /开辟一个求编码的工作空间 cdn-1=0; /编码结束符 for(i=1;i=n;+i) /逐个地求哈夫曼编码 start=n-1; /编码结束位置 for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent) /从叶子到根逆向求编码 if(HTf.lchild=c) cd-start=0; /若是左孩子编为0 else cd-start=1; /若是右孩子编为1 HCi=(char *)malloc(n-start)*sizeof(char); /为第i个编码分配空间 strcpy(HCi,&cdstart); /将编码从cd复制到HC中 free(cd); /释放工作空间void PrintHuffmanCode(HuffmanCode HC,unsigned int *w,int n)/显示有n个叶子结点的哈夫曼树的编码表 int i; printf(HuffmanCode is :n); for(i=1;i=n;i+) printf( %3d-,wi-1); puts(HCi); printf(n);void Select(HuffmanTree HT,int t,int&s1,int&s2)/在HT1.t中选择parent不为0且权值最小的两个结点,其序号分别为s1和s2 int i,m,n; m=n=10000; for(i=1;i=t;i+) if(HTi.parent=0&(HTi.weightm|HTi.weightn) if(ms2) /s1放较小的序号 i=s1;s1=s2;s2=i;#include #include #include #include #include typedef struct unsigned int weight;unsigned int parent,lchild,rchild; HTNode,*HuffmanTree;typedef char *HuffmanCode;typedef struct unsigned int s1;unsigned int s2; MinCode;void Error(char *message);HuffmanCode HuffmanCoding(HuffmanTree HT,HuffmanCode HC,unsigned int *w,unsigned int n);MinCode Select(HuffmanTree HT,unsigned int n);void Error(char *message) clrscr(); fprintf(stderr,Error:%sn,message); exit(1);HuffmanCode HuffmanCoding(HuffmanTree HT,HuffmanCode HC,unsigned int *w,unsigned int n) unsigned int i,s1=0,s2=0; HuffmanTree p; char *cd; unsigned int f,c,start,m; MinCode min; if(n=1) Error(Code too small!); m=2*n-1; HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode); for(p=HT,i=0;iweight=*w; p-parent=0; p-lchild=0; p-rchild=0; for(;iweight=0; p-parent=0; p-lchild=0; p-rchild=0; for(i=n+1;i=m;i+) min=Select(HT,i-1); s1=min.s1; s2=min.s2; HTs1.parent=i; HTs2.parent=i; HTi.lchild=s1; HTi.rchild=s2; HTi.weight=HTs1.weight+HTs2.weight; printf(HT List:n); printf(Numberttweightttparentttlchildttrchildn); for(i=1;i=m;i+) printf(%dtt%dtt%dtt%dtt%dn, i,HTi.weight,HTi.parent,HTi.lchild,HTi.rchild); HC=(HuffmanCode)malloc(n+1)*sizeof(char *); cd=(char *)malloc(n*sizeof(char *); cdn-1=0; for(i=1;i=n;i+) start=n-1; for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent) if(HTf.lchild=c) cd-start=0; else cd-start=1; HCi=(char *)malloc(n-start)*sizeof(char *); strcpy(HCi,&cdstart); free(cd); return HC;MinCode Select(HuffmanTree HT,unsigned int n) unsigned int min,secmin; unsigned int temp; unsigned int i,s1,s2,tempi; MinCode code; s1=1;s2=1; for(i=1;i=n;i+) if(HTi.parent=0) min=HTi.weight; s1=i; break; tempi=i+; for(;i=n;i+) if(HTi.weightmin&HTi.parent=0) min=HTi.weight; s1=i; for(i=tempi;i=n;i+) if(HTi.parent=0&i!=s1) secmin=HTi.weight; s2=i; break; for(i=1;i=n;i+) if(HTi.weights2) temp=s1; s1=s2; s2=temp; code.s1=s1; code.s2=s2; return code;void main() HuffmanTree HT=NULL; HuffmanCode HC=NULL; unsigned int *w=NULL; unsigned int i,n; clrscr(); printf(Input n:n); scanf(%d,&n); w=(unsigned int *)malloc(n+1)*sizeof(unsigned int *); w0=0; printf(Enter weight:n); for(i=1;i=n;i+) printf(w%d=,i); scanf(%d,&wi); HC=HuffmanCoding(HT,HC,w,n); printf(HuffmanCode:n); printf(NumberttWeightttCoden); for(i=1;i=n;i+) printf(%dtt%dtt%sn,i,wi,HCi); 程序运行:首先用户先输入一个数n,以实现n个节点的Huffman Tree之后输入权值w1wn,注意是unsigned int型数值。然后程序自动生成Huffman Tree的存储形式的一张表格。最后是Huffman Coding。Sample Input:Input n:8Enter weight:w1=5w2=29w3=7w4=8w5=14w6=23w7=3w8=11Sample Output:HT List:Number weight p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 园林工程栽植承包合同(3篇)
- 2025年民宿税务筹划服务协议
- 2025年民宿沉浸式推广协议
- 2025年环保型塑料替代品研发项目可行性研究报告及总结分析
- 电焊工证-上岗证考试试题题库含答案参考50
- 2025年儿童智能玩具市场发展可行性研究报告及总结分析
- 2025年智能消费电子产品市场调研可行性研究报告及总结分析
- 2025年医疗保健行业医疗健康品牌形象塑造案例分析报告
- 2025年江苏省市政质量员技能认定理论考试题库 含答案
- 2025年老人陪护合同协议
- 单管塔刚性短柱基础
- 大易通用能力测评题库
- 中医诊断四诊合参
- 武汉万科商品房交付标准化工作手册2.0版
- 食品安全考试试题及答案2021
- 郦道元《水经注·序》原文翻译注释与鉴赏
- 数独题目中级90题(后附答案)
- 西门子s71500系列系统手册
- 腹直肌分离康复(产后康复课件PPT)
- 携手共育 静待花开 家长会课件
- 酒驾处罚书格式(标准版)
评论
0/150
提交评论