C语言哈夫曼树的实现---小勇勇
来源:互联网 发布:手机淘宝号怎么注册 编辑:程序博客网 时间:2024/06/13 08:46
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
int weight;
int parent;
int Lchild;
int Rchild;
}HFTree;
int n;
int s1,s2;
void HFMT(HFTree* HT,int* a){
int i;
HT = (HFTree*)malloc((2 * n) * sizeof(HFTree));
for(i = 1;i <= n;i++){
HT[i].weight = a[i];
}
for(i = 1;i < 2 * n;i++){
HT[i].parent = 0;
HT[i].Lchild = 0;
HT[i].Rchild = 0;
}
for(i = n + 1;i < 2 * n;i++){
Select(HT,i-1);
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;
HT[i].weight = HT[i - 1].weight + HT[s1].weight;
}
printf("data\tweight\tparent\tLchild\tRchild\n");
for(i = 1 ;i < 2 * n;i++){
printf("%d\t%d\t%d\t%d\t%d\n",i,HT[i].weight,HT[i].parent,HT[i].Lchild,HT[i].Rchild);
}
CreatHFcode(HT,a);
free(HT);
}
int Select(HFTree* HT,int i){
int tmp =10000, tmpi = 0;
int j;
for(j = 1; j <= i; j++){
if(HT[j].parent == 0){
if(tmp > HT[j].weight){
tmp = HT[j].weight;
tmpi = j;
}
}
}
s1 = tmpi;
tmp = 10000;
tmpi = 0;
for(j = 1; j <= i; j++){
if(HT[j].parent == 0 && j != s1){
if(tmp > HT[j].weight){
tmp = HT[j].weight;
tmpi = j;
}
}
}
s2 = tmpi;
}
int CreatHFcode(HFTree* HT,int* a){
int i;
char** Hc;
char* cd;
int star,c,f;
cd = (char*)malloc(n * sizeof(char));
Hc = (char**)malloc(sizeof(char*) * n);
cd[n - 1] = '\0';
for(i = 1;i <= n ;++i){
star = n - 1;
c = i;
f = HT[i].parent;
while(f != 0){
--star;
if(HT[f].Lchild == c)cd[star] = '0';
else cd[star] = '1';
c = f;
f = HT[f].parent;
}
Hc[i] = (char*)malloc((n - star) * sizeof(char));
strcpy(Hc[i],&cd[star]);
}
printf("\n*******编码值*********\n");
for(i = 1 ;i <= n;i++){
printf("%d\t%s\n",a[i],Hc[i]);
}
free(cd);
free(Hc);
}
int main(int argc, char *argv[])
{
HFTree* HT;
int* a;
int i;
printf("请输入您所要输入的个数:");
scanf("%d",&n);
a = (int*)malloc((n + 1) * sizeof(int));
printf("请输入%d个数字:",n);
for(i = 1;i <= n;i++)
scanf("%d",&a[i]);
HFMT(HT,a);
free(a);
return 0;
}
#include <stdlib.h>
#include <string.h>
typedef struct{
int weight;
int parent;
int Lchild;
int Rchild;
}HFTree;
int n;
int s1,s2;
void HFMT(HFTree* HT,int* a){
int i;
HT = (HFTree*)malloc((2 * n) * sizeof(HFTree));
for(i = 1;i <= n;i++){
HT[i].weight = a[i];
}
for(i = 1;i < 2 * n;i++){
HT[i].parent = 0;
HT[i].Lchild = 0;
HT[i].Rchild = 0;
}
for(i = n + 1;i < 2 * n;i++){
Select(HT,i-1);
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;
HT[i].weight = HT[i - 1].weight + HT[s1].weight;
}
printf("data\tweight\tparent\tLchild\tRchild\n");
for(i = 1 ;i < 2 * n;i++){
printf("%d\t%d\t%d\t%d\t%d\n",i,HT[i].weight,HT[i].parent,HT[i].Lchild,HT[i].Rchild);
}
CreatHFcode(HT,a);
free(HT);
}
int Select(HFTree* HT,int i){
int tmp =10000, tmpi = 0;
int j;
for(j = 1; j <= i; j++){
if(HT[j].parent == 0){
if(tmp > HT[j].weight){
tmp = HT[j].weight;
tmpi = j;
}
}
}
s1 = tmpi;
tmp = 10000;
tmpi = 0;
for(j = 1; j <= i; j++){
if(HT[j].parent == 0 && j != s1){
if(tmp > HT[j].weight){
tmp = HT[j].weight;
tmpi = j;
}
}
}
s2 = tmpi;
}
int CreatHFcode(HFTree* HT,int* a){
int i;
char** Hc;
char* cd;
int star,c,f;
cd = (char*)malloc(n * sizeof(char));
Hc = (char**)malloc(sizeof(char*) * n);
cd[n - 1] = '\0';
for(i = 1;i <= n ;++i){
star = n - 1;
c = i;
f = HT[i].parent;
while(f != 0){
--star;
if(HT[f].Lchild == c)cd[star] = '0';
else cd[star] = '1';
c = f;
f = HT[f].parent;
}
Hc[i] = (char*)malloc((n - star) * sizeof(char));
strcpy(Hc[i],&cd[star]);
}
printf("\n*******编码值*********\n");
for(i = 1 ;i <= n;i++){
printf("%d\t%s\n",a[i],Hc[i]);
}
free(cd);
free(Hc);
}
int main(int argc, char *argv[])
{
HFTree* HT;
int* a;
int i;
printf("请输入您所要输入的个数:");
scanf("%d",&n);
a = (int*)malloc((n + 1) * sizeof(int));
printf("请输入%d个数字:",n);
for(i = 1;i <= n;i++)
scanf("%d",&a[i]);
HFMT(HT,a);
free(a);
return 0;
}
阅读全文
0 0
- C语言哈夫曼树的实现---小勇勇
- 哈夫曼树的c语言实现
- 哈夫曼树 C语言实现
- 哈夫曼树 C语言实现
- 哈夫曼树 C语言实现
- C语言实现哈夫曼树
- 哈夫曼树 C语言实现
- C语言实现的井字棋
- C语言--容器的实现。
- C语言--迭代器的实现。
- 栈的C语言实现
- 汉诺塔的C语言实现
- C语言实现的俄罗斯方块
- ls的C语言实现
- 队列的C语言实现
- 单链表的C语言实现
- c语言readline的实现
- C语言状态机的实现
- ODL中如何将配置文件打包到运行目录下
- 文件说明
- html 知识汇总与补充
- android权限大全
- 求矩阵的逆
- C语言哈夫曼树的实现---小勇勇
- 位运算的精髓
- 详解web标准
- CAMS
- 【SVN】svn服务器访问失败【由于连接方在一段时间后没有反应】
- java支付宝app支付代码
- 1030. 完美数列(25)
- Unity 相机 2D视角 与3D 视角 自由动态 切换
- 机器学习实战 adaBoost