求大神帮忙改一下,不知道哪里有问题,谢谢
#include<stdio.h>#include<stdlib.h>
#include<string.h>
#define MAXBIT 100 //定义哈夫曼树中叶子结点个数
#define MAXVALUE 10000 //定义最大权值
#define MAXLEAF 50 //定义叶子节点的最大数目
#define MAXNODE 2*MAXLEAF -1 //定义节点的最大数目
/* 结点结构体 */
typedef struct
{
int Weight;/*权值*/
int Parent;/*父结点*/
int LeftChild;/*左边孩子结点*/
int RightChild;/*右边孩子结点*/
} HuffmanNode;
/* 编码结构体 */
typedef struct
{
int bit[MAXBIT];//编码字符,这是为了后面输出没个哈夫曼的编码的数组
int start;//开始位置
} HuffmanCode;
void HuffmanTree (HuffmanNode HNode[MAXNODE],int n)
{
/* i、j: 循环变量,min1、min2:构造哈夫曼树不同过程中两个最小权值结点的权值,
b1、b2:构造哈夫曼树不同过程中两个最小权值结点在数组中的序号。*/
int i;
int j;
int min1,min2;
int b1,b2;
/* 初始化存放哈夫曼树数组 HNode[] 中的结点 */
for (i=0; i<2*n-1; i++)
{
HNode[i].Weight = 0;
HNode[i].Parent =-1;
HNode[i].LeftChild =-1;
HNode[i].RightChild =-1;
}
/* 循环构造 Huffman 树 */
for (i=0; i<n-1; i++)//构建Huffman树需要n-1合并
{
min1=min2=MAXVALUE; /* min1、min2中存放两个无父结点且结点权值最小的两个结点 */
b1=0;b2=0;
/* 找出所有结点中权值最小、无父结点的两个结点,并合并之为一颗二叉树 */
for (j=0; j<i; j++)//这里不懂 , 这个循环应该是想在所有节点中找最小的2个节//点,可是没有搞清楚到底有多少节点,忽略了你新合出来的节点。
{
if (HNode[j].Parent==-1)
{
if(HNode[j].Weight < min1 )
{
min2=min1;
b2=b1;
min1=HNode[j].Weight;
b1=j;
}
else
if(HNode[j].Weight < min2)
{
min2=HNode[j].Weight;
b2=j;
}
}
}
/* 设置找到的两个子结点 b1、b2 的父结点信息 */
HNode[b1].Parent=i;
HNode[b2].Parent=i;
HNode[i].LeftChild = b1;
HNode[i].RightChild =b2;
HNode[i].Weight = HNode[b1].Weight + HNode[b2].Weight;
printf ("权值和:%d (b1:%d, b2:%d)\n", HNode[i].Weight, HNode[b1].Weight, HNode[b2].Weight);
}
printf("\n");
}
void CreateHuffmanCode(HuffmanNode HNode[MAXNODE],HuffmanCode HCode[MAXLEAF],int n)
{
int i,j,c, f;
HuffmanCode cf;// 定义一个临时变量来存放求解编码时的信息
//这是要一个个哈夫曼编码输出出来,所以要临时变量,下面就是你输出的过程
for (i=0; i<n; i++)
{
cf.start = n;
c = i;
f = HNode[i].Parent;
while (f!=-1) //循序直到树根结点
{
if (HNode[f].LeftChild == c) //处理左孩子结点
cf.bit[cf.start--]='0';
else //处理右孩子结点
cf.bit[cf.start--]='1';
c=f;
f=HNode[f].Parent;
}
HCode[i]=cf;
}
for (i=1; i<=n; i++)
{
printf ("%d 的Huffman编码是: %s",HNode[i].Weight,HCode[i]);结构体数组这样输出是错的
for (j=HCode[i].start+1; j < n; j++)
{
printf ("%d", HCode[i].bit[j]);
}
printf ("\n");
}
}
int main()
{
int n,i;
HuffmanNode HNode[MAXNODE];
HuffmanCode HCode[MAXLEAF];
printf("请输入节点个数n:",n);
scanf("%d",&n);
printf("请输入这%d个权值:\n",n);
for (i=0; i<n;i++)
{
printf ("请输入第%d权值: ",i+1);
scanf ("%d", &HNode[i].Weight);
}
HuffmanTree (HNode,n);
CreateHuffmanCode(HNode,HCode,n);
return 0;
}