#include <stdio.h>
#include<string.h>
#define N 10     /*待编码字符的个数,即树中叶结点的最大个数*/
#define M 2*N-1  /*树中总的结点数目*/
typedef struct
{unsigned int weight;unsigned int parent,lchild,rchild;
}HTNode;  /*树中结点的结构*/typedef struct
{char data;     /*待编码的字符*/int weight;    /*字符的权值  */char code[N];  /*字符的编码 */
} HTCode;void Init(HTCode hc[],int *n)
{/*初始化,读入待编码字符的个数n,从键盘输入n个字符和n个权值*/int i;printf("\n按照要求输入相关的数据,注意输入完数据后,要按回车键!\n");printf("\n输入要编码的字符个数n:");scanf("%d",&(*n));printf("\n请输入%d个字符",*n);getchar();for (i=1;i<=*n;i++) {printf("请输入%d第个字符:\n",i);scanf("%c",&hc[i].data);getchar();//hc[i].data=getch();}printf("\ninput %d weight\n",*n);for (i=1;i<=*n;i++){printf("请输入%d第个权值:\n",i);scanf("%d",&hc[i].weight);getchar();//scanf("%d",&(hc[i].weight));}
}void Select(HTNode ht[],int k,int *s1,int *s2)
{/*ht[1…k]中选择parent为0,并且weight最小的两个结点其序号由指针变量s1,s2指向*/int i;for (i=1;i<=k && ht[i].parent!=0 ;i++);*s1=i;for (i=1;i<=k;i++)if (ht[i].parent==0 && ht[i].weight<ht[*s1].weight) *s1=i;for (i=1; i<=k ; i++)if (ht[i].parent==0 && i!=*s1) break;*s2=i;for (i=1;i<=k;i++)if ( ht[i].parent==0 && i!=*s1 && ht[i].weight<ht[*s2].weight) *s2=i;
}void HuffmanCoding(HTNode ht[],HTCode hc[],int n)
{/*构造Huffman树ht,并求出n个字符的编码*/char cd[N];int i,m,c,f,s1,s2,start;m=2*n-1;for (i=1;i<=m;i++){if (i<=n)  ht[i].weight=hc[i].weight;else ht[i].weight=0;ht[i].parent=ht[i].lchild=ht[i].rchild=0;}for (i=n+1;i<=m;i++){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;}cd[n-1]='\0';for (i=1;i<=n;i++) {start=n-1;for (c=i,f=ht[i].parent;f;c=f,f=ht[f].parent)if ((char)(ht[f].lchild)==c) cd[--start]='0';else cd[--start]='1';strcpy(hc[i].code,&cd[start]);}
}int main()
{int k,n;HTNode ht[M+1];HTCode hc[N+1];Init(hc,&n);           /*初始化*/HuffmanCoding(ht,hc,n);/*构造Huffman树,并形成字符的编码*/    for (k=1;k<=n;k++)printf("\n%c --- %s",hc[k].data,hc[k].code);/*输出字符的编码*/printf("\n");return 0;
}

数据结构源码笔记(C语言描述)汇总:

数据结构源码笔记(C语言):英文单词按字典序排序的基数排序

数据结构源码笔记(C语言):直接插入排序

数据结构源码笔记(C语言):直接选择排序

数据结构源码笔记(C语言):置换-选择算法

数据结构源码笔记(C语言):Huffman树字符编码

数据结构源码笔记(C语言):Josephus问题之顺序表

数据结构源码笔记(C语言):Josephus问题之循环链接表

数据结构源码笔记(C语言):多项式合并

数据结构源码笔记(C语言):二叉树之叶子结点旋转销毁

数据结构源码笔记(C语言):哈夫曼树

数据结构源码笔记(C语言):集合的位向量表示

数据结构源码笔记(C语言):链接队列

数据结构源码笔记(C语言):链接栈

数据结构源码笔记(C语言):线性表的单链表示

数据结构源码笔记(C语言):线性表的顺序表示

数据结构源码笔记(C语言):栈的基本操作

数据结构源码笔记(C语言):中缀表达式

数据结构源码笔记(C语言):希尔插入排序

数据结构源码笔记(C语言):索引文件建立和查找

数据结构源码笔记(C语言):冒泡排序

数据结构源码笔记(C语言):快速排序

数据结构源码笔记(C语言):可变长度字符串的快速排序

数据结构源码笔记(C语言):基数排序

数据结构源码笔记(C语言):二路归并排序

数据结构源码笔记(C语言):堆排序

数据结构源码笔记(C语言):二叉树搜索树Kruskal

数据结构源码笔记(C语言):二叉搜索树Prim

数据结构源码笔记(C语言):最短路径弗洛伊德算法

数据结构源码笔记(C语言):深度、广度优先生成树

数据结构源码笔记(C语言):邻接矩阵转化邻接表

数据结构源码笔记(C语言):统计字符串中出现的字符及其次数

数据结构源码笔记(C语言):顺序查找

数据结构源码笔记(C语言):哈希表的相关运算算法

数据结构源码笔记(C语言):分块法查找

数据结构源码笔记(C语言):二分查找

数据结构源码笔记(C语言):二叉树遍历

数据结构源码笔记(C语言):二叉平衡树的相关操作算法

数据结构源码笔记(C语言):二叉排序树的基本操作算法

数据结构源码笔记(C语言):B树的相关运算算法

数据结构源码笔记(C语言):Huffman树字符编码相关推荐

  1. 数据结构源码笔记(C语言):哈夫曼树

    #include <stdio.h> #include <stdlib.h> #define MAXINT 2147483647 #define MAXNUM 50 #defi ...

  2. 数据结构源码笔记(C语言):B树的相关运算算法

    //B树的相关运算算法#include<stdio.h> #include<malloc.h>#define MAXM 10//定义B树最大的阶数 typedef int Ke ...

  3. 数据结构源码笔记(C语言描述)汇总

    数据结构源码笔记(C语言):英文单词按字典序排序的基数排序 数据结构源码笔记(C语言):直接插入排序 数据结构源码笔记(C语言):直接选择排序 数据结构源码笔记(C语言):置换-选择算法 数据结构源码 ...

  4. 数据结构源码笔记(C语言):英文单词按字典序排序的基数排序

    //实现英文单词按字典序排序的基数排序算法#include<stdio.h> #include<malloc.h> #include<string.h>#defin ...

  5. 数据结构源码笔记(C语言):索引文件建立和查找

    //实现索引文件建立和查找算法#include<stdio.h> #include<malloc.h> #include<string.h> #include< ...

  6. 数据结构源码笔记(C语言):快速排序

    //实现快速排序算法 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; type ...

  7. 数据结构源码笔记(C语言):冒泡排序

    //冒泡排序算法实现 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; type ...

  8. 数据结构源码笔记(C语言):希尔插入排序

    //实现希尔插入排序算法 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; ty ...

  9. 数据结构源码笔记(C语言):直接插入排序

    //实现直接插入排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; typ ...

最新文章

  1. Java学习总结:14
  2. 13.文件:因为懂你,所以永恒
  3. 如何编程得到数据库信息
  4. LeetCode 6033. 转换数字的最少位翻转次数(位运算)
  5. 机器学习算法-Adaboost
  6. 使用 C++11 编写类似 QT 的信号槽——上篇
  7. hive窗口函数使用详解
  8. 超级搜索术-朱丹-全部笔记整理
  9. 深度学习实现代码汇总
  10. BCM94360Z4刷蓝牙固件魔改, Mac真正免驱无线网卡,实现原装网卡一样完美黑苹果,啊哈哈
  11. hdb3编码规则波形_(完整word版)AMI与HDB3码波形与功率谱密度实验
  12. 阿里云短信验证码购教程(Java演示)
  13. python自动注册邮箱_python+selenium实现163邮箱自动登陆的方法
  14. codeforces-760-B Frodo and pillows(二分+数学)
  15. 解决:RSA host key for [ip] has changed and you have requested strict checking.
  16. 微信公众平台接口程序语音天气
  17. 《掌舵》-还原一个真实的政商圈
  18. matlab可靠性优化,MATLAB在机械可靠性优化设计中的应用.pdf
  19. SCI SSCI CSSCI EI ISTP
  20. VUE后台管理系统模板

热门文章

  1. php 单例模式 序列化,php设计模式(二)单例模式
  2. php上位机grps通信,松下PLC与上位机通信实例
  3. splice方法_JavaScript数组常用方法
  4. 通过模拟器看Windows Phone 7
  5. Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程
  6. 杜恩德的新博客,都来看看
  7. 20169207 2016-2017-2 《网络攻防实践》 黑客资料总结
  8. GO 输出字符数同时输出这个字符串的字节数
  9. 02-导航实例-storyboard实现
  10. HDU 4417 Super Mario