凌晨到泰国机场:huffman哈夫曼编码译码问题哪里错了,高手来啊,谢谢!

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/09 11:52:10
#define MAXVALUE 10000
#define MAXLEAF 30
#define MAXNODE 9
#define MAXBIT 10
#define NULL 0
#include <stdio.h>

typedef struct BT
/*定义结点元素数据类型*/
{
char Data;
int Weight;
int Flag;
struct BT * Parent;
struct BT * LChild;
struct BT * RChild;
} bttype;

typedef struct
{
int Bit[MAXBIT];
int Start;
} hcodetype;

int n;

bttype * Haffman()
{
bttype HuffNode[MAXNODE];

int i,j,m1,m2,x1,x2;

printf("\n请输入叶结点个数 : ");
scanf("%d",&n);

//数组huff-node初始化
for(i=0; i<2*n-1; i++)
{
HuffNode[i].Weight = 0;
HuffNode[i].Parent = NULL;
HuffNode[i].Flag = 0;
HuffNode[i].LChild = NULL;
HuffNode[i].RChild = NULL;
}

//输入n个叶结点的权值
printf("\n请输入%d个权值: ",n);
for(i=0; i<n; i++)
scanf("%d", &HuffNode[i].Weight);

// 构造哈夫曼树
for(i=0; i<n-1; i++)
{
m1 = m2 = MAXVALUE;
x1 = x2 = 0;
for(j=0; j<n+i; j++)
{
if(HuffNode[j].Weight<m1 && HuffNode[j].Flag == 0)
{
m2 = m1;
x2 = x1;
m1 = HuffNode[j].Weight;
x1 = j;
}
if(HuffNode[j].Weight<m2 && HuffNode[j].Flag == 0)
{
m2 = HuffNode[j].Weight;
x2 = j;
}
}

//将找出的两棵子树合并为一棵子树
HuffNode[x1].Parent = &HuffNode[n+i];
HuffNode[x2].Parent = &HuffNode[n+i];
HuffNode[x1].Flag = 1;
HuffNode[x2].Flag = 1;
HuffNode[n+i].Weight = HuffNode[x1].Weight + HuffNode[x2].Weight;
HuffNode[n+i].LChild = &HuffNode[x1];
HuffNode[n+i].RChild = &HuffNode[x2];
}

return HuffNode;
}
void PrintTree(bttype *bt,int n)
{
int i;
if(bt==NULL)return;

// 中序遍历屏幕显示n+1层二叉树bt->RChild
PrintTree(bt->RChild,n+1);
// 光标移过前n-1层
for(i=0;i<n-1;++i)printf(" ");
if(n>=1)printf("-- --");
printf("%d\n",bt->Weight);
//中序遍历屏幕显示n+1层二叉树bt->LChild
PrintTree(bt->LChild,n+1);
}

void main()
{

bttype *bt;

bt=Haffman();
PrintTree(&bt[2*n-2],0);
}

我曾经做过!!!你要代码吗!!