哈夫曼树
来源:互联网 发布:ubuntu怎么编译c语言 编辑:程序博客网 时间:2024/04/29 13:03
这是我曾经做的关于哈弗曼树的小程序:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define n 8
#define m 2*n-1
typedef struct
{ int weight;
int lchild,rchild,parent;
}HTNode,*huffmantree;
typedef char **huffmancode;
void inputhf(huffmantree &T) //输入哈夫曼树的数据
{ int i;int k;
T=(huffmantree)malloc((m+1)*sizeof(HTNode));
for(i=1;i<=n;i++)
{ scanf("%d",&k);
T[i].weight=k;
T[i].parent=0;
T[i].lchild=0;
T[i].rchild=0;
}
for(i=n+1;i<=m;i++)
{ T[i].weight=0;
T[i].parent=0;
T[i].lchild=0;
T[i].rchild=0;
}
}
void selectmin(huffmantree &T,int k,int *p1,int *p2)//寻找两个weight最小的结点
{ int i;int s1=10000,s2=10000;
for(i=1;i<=k;i++)
{ if(T[i].parent==0)
if(T[i].weight<s1)
{ s2=s1;
s1=T[i].weight;
*p2=*p1;
*p1=i;
}
else
if(T[i].weight<s2)
{ s2=T[i].weight;
*p2=i;
}
}
}
void creathftree(huffmantree &T) //建哈夫曼树
{ int i,p1,p2;
inputhf(T);
for(i=n+1;i<=m;i++)
{ selectmin(T,i-1,&p1,&p2);
T[p1].parent=T[p2].parent=i;
T[i].lchild=p1;
T[i].rchild=p2;
T[i].weight=T[p1].weight+T[p2].weight;
}
}
void creathfcode(huffmantree T, huffmancode &H) //哈夫曼编码表
{ int i,c,p,start;char cd[n];
H=(huffmancode)malloc((n+1)*sizeof(char *));
cd[n-1]='/0';
for(i=1;i<=n;i++)
{
start=n-1;
for(c=i,p=T[i].parent;p!=0;c=p,p=T[p].parent)
if(T[p].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
H[i]=(char *)malloc((n-start)*sizeof(char));
strcpy(H[i],&cd[start]);
}
printf("赫夫曼编码:/n");
for(i=1;i<=n;i++) {
printf("%d-> %s/n",T[i].weight,H[i]);}
}
void main()
{
HTNode *T;
huffmancode H;
printf("请输入%d个结点的权值:/n",n);
creathftree(T);
creathfcode(T,H);
}
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- UrlReWriter 实现方法
- BASIS常用事务代码解释
- [转 载]收集30个新鲜惊艳的JQuery插件和教程(带演示代码)
- mysql集群配置
- 正交表
- 哈夫曼树
- 【转】memcpy memmove 区别
- MPLS VPN 问题
- 通用传输平台开发实录【5】哈希算法
- mysql中随机提取数据库记录
- C#如何快速高效地导出10万以上的大量数据?
- Advanced Windows Debugging - Heap Corruption Part II
- MYSQL查询优化技巧
- ElGono: Planless waste of time or how I installed Plan9