c语言实现构造哈夫曼树

输入字符和权值,实现哈夫曼树的构造

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 50
typedef char DataType;typedef struct    // 哈夫曼树结点的结构
{DataType data; // 数据用字符表示int weight;   // 权值int parent;    // 双亲int lchild,rchild; // 左右孩子
} HuffNode;typedef struct   // 哈夫曼编码的存储结构
{DataType cd[MAXSIZE];  // 存放编码位串int start; // 编码的起始位置
} HuffCode;void HuffmanCreate(HuffNode *ht,int n)
{int i,j,p1,p2,m1,m2;for(i=1;i<=n;i++){getchar();    // 接收回车printf("哈夫曼树第%d个字符及其权重分别为(用空格分隔)""\n",i);scanf("%c %d",&ht[i].data,&ht[i].weight);}for(i=1;i<=2*n -1;i++) // 对数组初始化ht[i].parent=ht[i].lchild=ht[i].rchild=0;for(i=n+1;i<=2*n -1;i++){m1=m2=32767;    // 令 m1 、m2 为整数最大值p1=p2=1;for(j=1;j<i;j++)  //  找出 parent 为 0 且权值最小的两个结点{if(ht[j].parent==0){if(ht[j].weight<m1){m2=m1;p2=p1;m1=ht[j].weight;p1=j;}else if(ht[j].weight<m2){m2=ht[j].weight;p2=j;}}}ht[i].lchild=p1; //p1 为新结点的左孩子ht[i].rchild=p2;      //p2    为新结点的右孩子ht[i].weight=m1+m2;   //  新结点的权值为最小权值和次小权值的和ht[p1].parent=i;ht[p2].parent=i;}
printf("哈夫曼树已成功建立!  \n");}void Encoding(HuffNode *ht,HuffCode *hcd,int n)
{HuffCode d;int i,j,f;for(i=1;i<=n;i++)  // 对所有结点循环{d.start=n+1;   // 起始位置f=ht[i].parent; // 双亲的位置for(j=i;f!=0;j=f,f=ht[j].parent){if(ht[f].lchild==j)d.cd[ --d.start]='0';  // 规定左树代码为  0elsed.cd[ --d.start]='1';   // 规定右树代码为  1}hcd[i]=d;}printf("输出哈夫曼编码:   \n");for(i=1;i<=n;i++){printf("%c" ,ht[i].data);  // 先输出结点for(j=hcd[i].start;j<=n;j++)     // 在输出其对应编码printf("%c",hcd[i].cd[j]);printf("\n");}
}void Decoding(HuffNode *ht,int n)
{DataType c,ch[200];    //c 接收输入电文,  ch 储存int i,temp,f;printf("请输入电文,以“#”为结束标志:\n");c=getchar();i=0;while(c!='#'){i++;   //ch 数组下标后移ch[i]=c;    // 将单个字符依次存入    ch 字符串中c=getchar();}temp=i;   // 标记数组存储末位位置i=1;printf("输出哈夫曼译码:  \n");while(i<=temp){f=2*n -1; // 每次都从根节点开始查找while(ht[f].lchild!=0){if(ch[i]=='0')f=ht[f].lchild;if(ch[i]=='1')f=ht[f].rchild;i++;}printf("%c",ht[f].data);}printf("\n");
}void main()
{int n,select;HuffNode ht[MAXSIZE*2];   // 定义存放哈夫曼树的数组HuffCode hcd[MAXSIZE];    // 定义存放编码的数组while(1){printf( "1---建立哈夫曼树   \n");printf( "2---编码   \n");printf( "3---译码  \n");printf("4---退出系统    \n");printf(" 请输入您所要实现的功能:"   );scanf("%d",&select);switch(select){case 1:printf("请输入字符个数:"    );scanf("%d",&n);HuffmanCreate(ht,n);break;case 2:Encoding(ht,hcd,n);break;case 3:Decoding(ht,n);break;case 4:exit(0);}}
}

c语言实现哈夫曼树构造相关推荐

  1. C语言:哈夫曼树构造及编码(核心代码每一行都有注释)

    一.[实验目的及要求] 理解Huffman树的概念及其存储结构: 熟悉Huffman树的构造: 掌握Huffman树的编码方法. 二.[实验内容] 1.代码实现Huffman编码 2.请统计每个字符出 ...

  2. c语言哈夫曼树构造代码

    c语言哈夫曼树构造代码 博主就很掘的一个人,最近学哈夫曼树,想着用指针去实现,觉得用指针实现,内存消耗会更少,写到后面发现越来与麻烦,且内存开销并没有减少,于是还是使用结构体数组中规中矩的去实现哈夫曼 ...

  3. c语言哈夫曼树统计字母频率,C语言实现哈夫曼树

    本文实例为大家分享了C语言实现哈夫曼树的具体代码,供大家参考,具体内容如下 //哈夫曼树C语言实现 #include #include typedef struct HuffmanNode { cha ...

  4. 哈夫曼树构造以及代码实现

    哈夫曼树构造以及代码实现 什么是哈夫曼树 理解哈夫曼树 哈夫曼树的构造 哈夫曼树构造-代码实现 什么是哈夫曼树 构造一颗二叉树,该树的带权路径长度达到最小,称为最优二叉树,也称为哈夫曼树(Huffma ...

  5. 哈夫曼树构造哈夫曼编码

    在传输文字时,经常要将文字转换成二进制字符串.所以我们希望编码最短,但是又想保证它的唯一性.哈夫曼树具有最小带权路径长度,用来实现编码就可以编码最短,所以用哈夫曼树来构造编码.而前缀编码就可以保证在解 ...

  6. 算法学习笔记10——应用哈夫曼树构造最短的不等长编码方案

    内容: (1)设需要编码的字符集为{d1, d2, -, dn},它们出现的频率为{w1, w2, -, wn},应用哈夫曼树构造最短的不等长编码方案. 提示: 哈夫曼树(Huffman Tree), ...

  7. 哈夫曼树构造算法的正确性证明

    哈夫曼树构造 1.哈夫曼树的定义 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree). 2.哈夫曼树的构造 假 ...

  8. 【Lua】哈夫曼树构造算法的分析与实现

    哈夫曼树构造算法分析 1.哈夫曼树中权重越大的叶子离根越近,采用贪心算法构造哈夫曼树,首先选中权重值小的叶子结点进行构造 2.步骤 构造森林全是根:根据n个给定结点的权重值{W1, W2-Wn}构成 ...

  9. 最小堆实现哈夫曼树构造

    0. 序 本以为用最小堆实现个哈夫曼树是个简单的事情,结果一不小心就花了好几个小时才写完...实现过程中主要有三个方面的问题没注意,导致花了很多时间进行调试. 一是多重指针malloc分配时要多加注意 ...

最新文章

  1. ES学习笔记之-AvgAggregation的实现过程分析
  2. 没有任何基础的可以学python吗-对没有编程基础的人来说,直接学Python入门IT合适吗?...
  3. WPF代码模板-布局部分
  4. ZOJ1654(二分构图题典例)
  5. 分类素材(part3)--python机器学习基础教程(下)
  6. 说两句电视剧《东归英雄》
  7. python3的面向对象_python3学习之面向对象
  8. 95-30-010-Broker- Broker上线下线
  9. poj - 2503 Babelfish
  10. Go Elasticsearch 更新快速入门
  11. 服务器 发布web项目路径,发布到 Web 平台
  12. FNT不能计算通用数据集(看看fwt···)
  13. 领域的初学者--推荐的一本书
  14. 海康RTSP客户端连接深入分析
  15. SQLEXPRESS服务无法启动
  16. linux命令查看文件读写,linux系统查看和修改文件读写命令
  17. ICE入门之hello world
  18. 天津财经大学珠江学院考计算机二级,【2019年12月天津计算机二级考试报名入口已开通】- 环球网校...
  19. Linux中etc目录详解大全总汇详解
  20. 我国制造业供应链管理存在哪些问题?

热门文章

  1. 腾讯位置服务2021年中秋节国庆节假期服务公告
  2. 友盟推送8.0信息不展示(推送状态却为已送达)
  3. 使用Awescnb构建酷炫的博客园皮肤
  4. 转:MM--公司委托加工流程
  5. DP 例9-5 Jin Ge Jin Qu hao UVA - 12563
  6. JavaScript 逼真图片倒计时实现代码 js时间图片倒计时
  7. android记忆软件 - iRemember
  8. 计算机组成原理——辅助存储器
  9. 【MyBatis】防止sql注入
  10. 化工贸易行业的客户信用及应收账款管理解决方案