博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
温习 数据结构之HuffmanTree
阅读量:6079 次
发布时间:2019-06-20

本文共 2166 字,大约阅读时间需要 7 分钟。

一定要亲自试了,才会印象深刻呢!!!

//HuffmanTree#include
#include
#include
#define UNIT_MAX 10000typedef struct{ unsigned int weight; unsigned int parent,lchild,rchild;}HTNode,*HuffmanTree; //动态分配数组存储HuffmanTreetypedef char **HuffmanCode;//动态分配数组存储HuffmanCodeint min1(HuffmanTree t,int i){//函数VOID select调用 int j,flag; unsigned int k=UNIT_MAX;//取K为最小可能的值 for(j=1;j<=i;j++) if(t[j].weight
*s2) { j=*s1; *s1=*s2; *s2=j; }}void HuffmanCoding(HuffmanTree *HT,HuffmanCode *HC,int *w,int n) //这里也是必须用两个*,我开始以为不用的呢。。。{//w存放n个字符的权值(>0),构造哈弗曼树HT,并求出n个字符的哈弗曼编码HC、 int m,i; HuffmanTree p; if(n<=1) return ; m=2*n-1; *HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //0号单元未用 for(p=*HT+1,i=1;i<=n;++i,++p,++w) { p->weight=*w; p->parent=0; p->lchild=0; p->rchild=0; } for(;i<=m;++i,++p) { p->weight=0; p->parent=0; p->lchild=0; p->rchild=0; } for(i=n+1;i<=m;++i)//建HuffmanTree {//在HT[1..i-1]中选择parent为0且weight最小的两个节点,其序号分别为s1,s2. int s1,s2; select(*HT,i-1,&s1,&s2); //选出最小的两个节点 (*HT)[s1].parent=i;(*HT)[s2].parent=i; (*HT)[i].lchild=s1;(*HT)[i].rchild=s2; (*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight; } //-------------从叶子到根逆向求每个字符的HuffmanCode-------- *HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); //分配n个字符编码的头指针向量 char *cd; cd=(char*)malloc(n*sizeof(char)); cd[n-1]='\0'; //分配求编码的工作空间 for(i=1;i<=n;++i) { int start=n-1; int f,c; for(c=i,f=(*HT)[i].parent;f!=0;c=f,f=(*HT)[f].parent) //从叶子到根逆向求编码 从第一个节点开始遍历 if((*HT)[f].lchild==c) cd[--start]='0'; else cd[--start]='1'; (*HC)[i]=(char*)malloc((n-start)*sizeof(char)); //为第i个字符编码分配空间 strcpy((*HC)[i],&cd[start]); //从cd复制编码串到HC 这个超经典啊 为什么要用个&!! } free(cd);}//HuffmaCodingint main(){ HuffmanTree HT; HuffmanCode HC; int *w,n,i; printf("请输入权值的个数(>1):"); scanf("%d",&n); w=(int*)malloc(n*sizeof(int));//为数据开辟空间 printf("请依次输入%d个权值(整型):\n",n); for(i=0;i<=n-1;i++) scanf("%d",w+i); HuffmanCoding(&HT,&HC,w,n); for(i=1;i<=n;i++) puts(HC[i]); return 0;}

  

转载地址:http://unhgx.baihongyu.com/

你可能感兴趣的文章
网站优化的14条准则
查看>>
IOSTips:UIButton 设置图片文字垂直排列
查看>>
python 学习笔记 1 for循环中常用的函数
查看>>
7-Java面向对象-多态
查看>>
Zookeeper可以干什么?
查看>>
短视频APP平台怎么开发?不得不了解的短视频源码功能机制后篇
查看>>
常用RGB色值表
查看>>
Google Play 发现恶意应用,窃取用户数字货币
查看>>
极简风Js时钟
查看>>
用js来实现那些数据结构14(树02-AVL树)
查看>>
C# 复制一个Word文档的部分或全部内容到另一个Word文档
查看>>
7-Zip 19.00 正式版发布,修正 Win10 1809(17763) 可能无法正常使用大内存页
查看>>
Gartner:中国企业追求AI实战性 云厂商正引领这一方向
查看>>
Web前端单元测试到底要怎么写?看这一篇就够了
查看>>
基于PostGIS的高级应用(2)--线数据的汇总分析
查看>>
跟着小程一起聊聊GIT那点事
查看>>
使用scikit-learn解决文本多分类问题(附python演练)
查看>>
好看的皮囊 · 也是大自然的杰作 · 全球高质量 · 美图 · 集中营 · 美女 · 2017-08-22期...
查看>>
【Java疑难杂症】有return的情况下try catch finally的执行顺序
查看>>
求算符文法的FIRSTVT集的算法
查看>>