哈夫曼编码译码的C语言实现过程(不知为何进行到return 0时会发生程序崩溃)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 1000
typedef int ElementType;
typedef struct HFMTNode
{
ElementType Data; //结点的数据域
int w; //结点的权值
int parent, lchild, rchild; //结点的双亲,左孩子,右孩子
}HFMTNode;
typedef struct Code
{
int bit[10]; //数组
int start; //编码的起始下标
int w; //字符的权值
}Code;
void CreateHFMTree(HFMTNode Ht[], int N)
{
int i, k, lmin, rmin; //lmin和rmin为最小权值的两个结点位置
int min1, min2; //min1和min2为最小权值的两个结点
for (i = 1; i < 2 * N; i++)
{
Ht[i].parent = Ht[i].lchild = Ht[i].rchild = -1; //初始化各域初值为-1
}
for (i = N + 1; i < 2 * N; i++)
{
min1 = min2 = MAX; //MAX为大于所有权值的一个值
lmin = rmin = -1;
for (k = 1; k <= i - 1; k++)
{
if (Ht[k].parent == -1) //只在尚未构造二叉树的结点中进行
{
if (Ht[k].w < min1)
{
min2 = min1;
rmin = lmin;
min1 = Ht[k].w;
lmin = k;
}
else if (Ht[k].w < min2)
{
min2 = Ht[k].w;
rmin = k;
}
}
}
Ht[lmin].parent = i;
Ht[rmin].parent = i;
Ht[i].w = Ht[lmin].w + Ht[rmin].w;
Ht[i].lchild = lmin;
Ht[i].rchild = rmin;
}
}
void HFMCode(HFMTNode Ht[], int n, Code c[])
{
Code *cd = (Code*)malloc(sizeof(Code));
int i, j, child, parent;
for (i = 1; i <= n; i++) //求n个叶子结点的哈夫曼编码
{
cd->start = n ; //不等长编码的最后一位为n
cd->w = Ht[i].w; //取得编码对应的权值
child = i;
parent = Ht[child].parent;
while (parent != -1) //由叶子结点直到根结点
{
if (Ht[parent].lchild == child)
{
cd->bit[cd->start] = 0; //左孩子编码为0
}
else
{
cd->bit[cd->start] = 1; //右孩子编码为1
}
cd->start--;
child = parent;
parent = Ht[child].parent;
}
for (j = cd->start+1; j <= n; j++)
{
c[i].bit[j] = cd->bit[j]; //保存每个叶子结点的编码
}
c[i].start = cd->start + 1; //保存叶子结点的起始位置
c[i].w = cd->w; //保存叶子结点的权值
}
}
void Decode(HFMTNode Ht[],int n) //依次读入编码,根据哈夫曼树译码
{
int i, j = 0;
char b[100];
i = 2 * n - 1; //从根结点开始往下搜索
printf("\n输入发送的编码(以'2'为结束标志):");
getchar();
gets_s(b,100);
printf("译码后的字符为");
while (b[j] != '2')
{
if (b[j] == '0')
i = Ht[i].lchild; //走向左孩子
else
i = Ht[i].rchild; //走向右孩子
if (Ht[i].lchild == -1) //Ht[i]是叶结点
{
printf("%d\t", Ht[i].w);
i = 2 * n - 1; //回到根结点
}
j++;
}
printf("\n");
if (Ht[i].lchild != -1 && b[j] != '2') //编码读完,但尚未到叶子结点
{
printf("\nERROR\n"); //输入编码有错
}
}
int main()
{
HFMTNode H1[100];
int n;
printf("请输入叶子节点数:");
scanf_s("%d", &n);
for (int i = 1; i <= n; i++)
{
printf("请输入第%d个权值:", i);
scanf_s("%d", &H1[i].w);
}
CreateHFMTree(H1, n);
for (int i = 1; i <= (2*n-1); i++)
{
printf("%d\n", H1[i].w);
}
Code *c1 = (Code *)malloc(sizeof(Code)*n);
HFMCode(H1, n, c1);
for (int i = 1; i <= n; i++)
{
printf("\nweight = %d,Code = ", c1[i].w);
for (int j = c1[i].start; j <= n; j++)
{
printf("%d", c1[i].bit[j]);
}
}
Decode(H1, n);
return 0;
}
这里是使用VC2017编译器进行调试发现运行到最后有错误!
希望有大佬能够帮忙解答一下!!!不知道是不是我的VC2017编译器的设置有问题还是代码有问题。。