c语言实现哈夫曼树构造
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语言实现哈夫曼树构造相关推荐
- C语言:哈夫曼树构造及编码(核心代码每一行都有注释)
一.[实验目的及要求] 理解Huffman树的概念及其存储结构: 熟悉Huffman树的构造: 掌握Huffman树的编码方法. 二.[实验内容] 1.代码实现Huffman编码 2.请统计每个字符出 ...
- c语言哈夫曼树构造代码
c语言哈夫曼树构造代码 博主就很掘的一个人,最近学哈夫曼树,想着用指针去实现,觉得用指针实现,内存消耗会更少,写到后面发现越来与麻烦,且内存开销并没有减少,于是还是使用结构体数组中规中矩的去实现哈夫曼 ...
- c语言哈夫曼树统计字母频率,C语言实现哈夫曼树
本文实例为大家分享了C语言实现哈夫曼树的具体代码,供大家参考,具体内容如下 //哈夫曼树C语言实现 #include #include typedef struct HuffmanNode { cha ...
- 哈夫曼树构造以及代码实现
哈夫曼树构造以及代码实现 什么是哈夫曼树 理解哈夫曼树 哈夫曼树的构造 哈夫曼树构造-代码实现 什么是哈夫曼树 构造一颗二叉树,该树的带权路径长度达到最小,称为最优二叉树,也称为哈夫曼树(Huffma ...
- 哈夫曼树构造哈夫曼编码
在传输文字时,经常要将文字转换成二进制字符串.所以我们希望编码最短,但是又想保证它的唯一性.哈夫曼树具有最小带权路径长度,用来实现编码就可以编码最短,所以用哈夫曼树来构造编码.而前缀编码就可以保证在解 ...
- 算法学习笔记10——应用哈夫曼树构造最短的不等长编码方案
内容: (1)设需要编码的字符集为{d1, d2, -, dn},它们出现的频率为{w1, w2, -, wn},应用哈夫曼树构造最短的不等长编码方案. 提示: 哈夫曼树(Huffman Tree), ...
- 哈夫曼树构造算法的正确性证明
哈夫曼树构造 1.哈夫曼树的定义 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree). 2.哈夫曼树的构造 假 ...
- 【Lua】哈夫曼树构造算法的分析与实现
哈夫曼树构造算法分析 1.哈夫曼树中权重越大的叶子离根越近,采用贪心算法构造哈夫曼树,首先选中权重值小的叶子结点进行构造 2.步骤 构造森林全是根:根据n个给定结点的权重值{W1, W2-Wn}构成 ...
- 最小堆实现哈夫曼树构造
0. 序 本以为用最小堆实现个哈夫曼树是个简单的事情,结果一不小心就花了好几个小时才写完...实现过程中主要有三个方面的问题没注意,导致花了很多时间进行调试. 一是多重指针malloc分配时要多加注意 ...
最新文章
- ES学习笔记之-AvgAggregation的实现过程分析
- 没有任何基础的可以学python吗-对没有编程基础的人来说,直接学Python入门IT合适吗?...
- WPF代码模板-布局部分
- ZOJ1654(二分构图题典例)
- 分类素材(part3)--python机器学习基础教程(下)
- 说两句电视剧《东归英雄》
- python3的面向对象_python3学习之面向对象
- 95-30-010-Broker- Broker上线下线
- poj - 2503 Babelfish
- Go Elasticsearch 更新快速入门
- 服务器 发布web项目路径,发布到 Web 平台
- FNT不能计算通用数据集(看看fwt···)
- 领域的初学者--推荐的一本书
- 海康RTSP客户端连接深入分析
- SQLEXPRESS服务无法启动
- linux命令查看文件读写,linux系统查看和修改文件读写命令
- ICE入门之hello world
- 天津财经大学珠江学院考计算机二级,【2019年12月天津计算机二级考试报名入口已开通】- 环球网校...
- Linux中etc目录详解大全总汇详解
- 我国制造业供应链管理存在哪些问题?