数据结构赫夫曼树源程序
来源:互联网 发布:新顶级域名不备案吗 编辑:程序博客网 时间:2024/05/29 07:37
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
typedef struct {
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树
typedef char * *HuffmanCode;
int min(HuffmanTree t,int i)
{
int j,flag;
unsigned int k = 1000;
for(j=1; j<=i; j++)
{
if(t[j].weight<k && t[j].parent==0)
{
k = t[j].weight;
flag = j;
}
}
t[flag].parent = 1;
return flag;
}
void select(HuffmanTree t,int i,int &s1,int &s2)
{
int j;
s1 = min(t,i);
s2 = min(t,i);
if(s1>s2)
{
j = s1;
s1 = s2;
s2 = j;
}
}
void HuffmanCoding(HuffmanTree& HT,HuffmanCode& HC,int *w,int n)
{
int m = 0;
int i = 0;
int s1 = 0;
int s2 = 0;
int start = 0;
char *cd;
HuffmanTree p;
unsigned int c,f;
if(n<=1) return;
m = 2*n - 1;
HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1; i<=n; ++i,++p,++w)
{
(*p).weight = *w;
(*p).lchild = 0;
(*p).rchild = 0;
(*p).parent = 0;
}
for(; i<=m; ++i,++p)
{
(*p).parent = 0;
}
for(i=n+1; i<=m; ++i)
{
select(HT,i-1,s1,s2);
HT[s1].parent = HT[s2].parent = i;
HT[i].lchild = s1;
HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
HC = (HuffmanCode)malloc((n+1)*sizeof(char*));
cd = (char*)malloc(n*sizeof(char));
cd[n-1] = '\0';
for(i=1; i<=n; i++) {
start = n-1;
for(c=i,f=HT[i].parent;f!=0; c=f,f=HT[f].parent)
{
if(HT[f].lchild==c)
cd[--start] = '0';
else
cd[--start] = '1';
}
HC[i] = (char*)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
}
free(cd);
}
void main()
{
//int *w,n,i;
HuffmanTree HT;
HuffmanCode HC;
int *w,n,i;
printf("请输入权值的个数:");
scanf("%d",&n);
w = (int *)malloc(n*sizeof(int));
printf("输入%d个结点的权值\n",n);
for(i = 0;i < n;i++)
{
scanf(" %d",w+i);
}
HuffmanCoding(HT,HC,w,n);
for(i = 1;i <= n;i++)
{
printf("权值为%d 的字符的编码为 ",*(w+i-1));
puts(HC[i]);
}
return;
}
#include<stdlib.h>
#include<stdio.h>
typedef struct {
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树
typedef char * *HuffmanCode;
int min(HuffmanTree t,int i)
{
int j,flag;
unsigned int k = 1000;
for(j=1; j<=i; j++)
{
if(t[j].weight<k && t[j].parent==0)
{
k = t[j].weight;
flag = j;
}
}
t[flag].parent = 1;
return flag;
}
void select(HuffmanTree t,int i,int &s1,int &s2)
{
int j;
s1 = min(t,i);
s2 = min(t,i);
if(s1>s2)
{
j = s1;
s1 = s2;
s2 = j;
}
}
void HuffmanCoding(HuffmanTree& HT,HuffmanCode& HC,int *w,int n)
{
int m = 0;
int i = 0;
int s1 = 0;
int s2 = 0;
int start = 0;
char *cd;
HuffmanTree p;
unsigned int c,f;
if(n<=1) return;
m = 2*n - 1;
HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1; i<=n; ++i,++p,++w)
{
(*p).weight = *w;
(*p).lchild = 0;
(*p).rchild = 0;
(*p).parent = 0;
}
for(; i<=m; ++i,++p)
{
(*p).parent = 0;
}
for(i=n+1; i<=m; ++i)
{
select(HT,i-1,s1,s2);
HT[s1].parent = HT[s2].parent = i;
HT[i].lchild = s1;
HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
HC = (HuffmanCode)malloc((n+1)*sizeof(char*));
cd = (char*)malloc(n*sizeof(char));
cd[n-1] = '\0';
for(i=1; i<=n; i++) {
start = n-1;
for(c=i,f=HT[i].parent;f!=0; c=f,f=HT[f].parent)
{
if(HT[f].lchild==c)
cd[--start] = '0';
else
cd[--start] = '1';
}
HC[i] = (char*)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
}
free(cd);
}
void main()
{
//int *w,n,i;
HuffmanTree HT;
HuffmanCode HC;
int *w,n,i;
printf("请输入权值的个数:");
scanf("%d",&n);
w = (int *)malloc(n*sizeof(int));
printf("输入%d个结点的权值\n",n);
for(i = 0;i < n;i++)
{
scanf(" %d",w+i);
}
HuffmanCoding(HT,HC,w,n);
for(i = 1;i <= n;i++)
{
printf("权值为%d 的字符的编码为 ",*(w+i-1));
puts(HC[i]);
}
return;
}
0 0
- 数据结构赫夫曼树源程序
- 哈夫曼编码(数据结构)源程序
- 数据结构迷宫源程序
- 数据结构二叉树源程序
- 数据结构——表达式求值源程序(一)
- 大话数据结构,双端循环链表,源程序
- 扫雷源程序
- 寻求源程序
- 十大建站开源程序
- sp源程序
- 源程序网址
- MATLAB源程序
- ximolcd 源程序
- 分群源程序
- 象棋源程序
- Triangle源程序
- 博客源程序
- 源程序分析
- ios开发中,关于javascript直接调用oc代码而非通过改变url回调方式
- 错误列表集锦
- 数据结构二叉树源程序
- 从程序员的角度谈创业三年的亲身体会
- sphinx windows安装25个常见问题+win7系统中要注意的事项
- 数据结构赫夫曼树源程序
- Android studio 下载安装
- 按键精灵微信群内加好友
- 使用qmeu-img创建虚拟机(创建虚拟机,虚拟机快照)
- Dalvik 虚拟机指令
- ofstream打开中文路径失败解决方法
- J2EE--运用JODConverter进行doc、ppt到pdf的转换
- I/O流
- 数据结构进制转换源代码