#include <stdio.h>
#include <stdlib.h>
#define MAXINT 2147483647
#define MAXNUM 50
#define MAXNODE 100
struct HtNode //哈夫曼树结点的结构
{
int ww;
int parent,llink,rlink;
};
struct HtTree
{
struct HtNode ht[MAXNODE];
int root;//哈夫曼树根在数组中的下标
};
typedef struct HtTree *PHtTree;//哈夫曼树类型的指针类型
PHtTree huffman(int m,int *w) //构造m个叶结点的haffman树
{
PHtTree pht;
int i,j,x1,x2,m1,m2;
pht=(PHtTree)malloc(sizeof(struct HtTree)); //创建空haffman树
if(pht==NULL)
{
printf("Out of space!!\n");
return pht;
}
for(i=0;i<2*m-1;i++) //置初态
{
pht->ht[i].llink=-1;
pht->ht[i].rlink=-1;
pht->ht[i].parent=-1;
if(i<m)
pht->ht[i].ww=w[i];
else
pht->ht[i].ww=-1;
}
for(i=0;i<m-1;i++) //每循环一次构造一个内部结点
{
m1=MAXINT;
m2=MAXINT; //相关变量赋初值
x1=-1;
x2=-1;
for(j=0;j<m+1;j++) //找两个最小权值的无父结点的结点
if(pht->ht[j].ww<m1&&pht->ht[j].parent==-1)
{
m2=m1;
x2=x1;
m1=pht->ht[j].ww;
x1=j;
}
else
if(pht->ht[j].ww<m2&&pht->ht[j].parent==-1)
{
m2=pht->ht[j].ww;
x2=j;
}
pht->ht[x1].parent=m+i; //构造一个内部结点
pht->ht[x2].parent=m+i;
pht->ht[m+i].ww=m1+m2;
pht->ht[m+i].llink=x1;
pht->ht[m+i].rlink=x2;
pht->root=m+i;
}
return pht;
}
void printcode(PHtTree pht,int m) //打印huffman树pht中每个外部结点的编码
{
int i,j;
int parentnode;
for(j=0;j<m;j++)
{
if(pht->ht[j].llink!=-1||pht->ht[j].rlink!=-1) continue;//不是分支结点
printf("the Reverse conde of node%d is :",j+1); //得到的编码应倒过来
i=j;
while(pht->ht[i].parent!=-1)
{
parentnode=pht->ht[i].parent;
if(pht->ht[parentnode].llink==i)
printf("0");
else
printf("1");
i=parentnode;
}
printf("\n");
}
}
int main()
{
int m=6;
int w[]={1,3,5,7,9,11};
PHtTree pht;
pht=huffman(6,w);
printcode(pht,m);
return 0;
}
数据结构源码笔记(C语言描述)汇总: