哪位能帮忙看看我的代码,大一,C++没学
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct {
int weight; //权值
int parent, lchild, rchild;
}HTNode, * HuffmanTree; //动态分配数组存储霍夫曼树
typedef char** HuffmanCode;//动态分配数组存储霍夫曼编码
int s1, s2;
//选择出最小的两个结点
void select(HuffmanTree HT, int k) {
int i;
i = 1;
while (i <= k && HT[i].parent != 0)
i++;
s1 = i;
for (i = 1; i <= k; i++)
{
if (HT[i].parent == 0 && HT[i].weight < HT[s1].weight)s1 = i;
}
for (i = 1; i <= k; i++)
{
if (HT[i].parent == 0 && i != s1)
break;
}
s2 = i;
for (i = 1; i <= k; i++)
{
if (HT[i].parent == 0 && i != s1 && HT[i].weight < HT[s2].weight)
s2 = i;
}
}
//构建霍夫曼树
void HuffmanCoding(HuffmanTree HT, char HC[][100], int* w, int n) {
int m, c, f, i, start;
char* cd;
if (n <= 1)return;
m = 2 * n - 1; //n个叶子结点,n-1个非叶子结点
HT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode)); //预分配m+1个单元,0号单元未用
HuffmanTree p = NULL;
if (p == NULL) {
exit(0);
}
w++; //w从1号开始
for (i = 1; i <= n; i++, p++, w++) //对n个叶子结点赋初值
{
p->weight = w;
p->parent = p->rchild = p->lchild = 0;
}
for (; i <= m; ++i, ++p) //对另外n-1个叶子结点赋初值
{
p->weight = p->parent = p->rchild = p->lchild = 0;
}
for (i = n + 1; i <= m; i++)
{
select(HT, i - 1);
HT[s1].parent = i;
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[24] = '\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)); //为第i个字符编码分配空间
strcpy_s(HC[i], &cd[start]);//从cd复制编码到HC
}
free(cd); //释放工作空间
}
int main() {
int n, i;
//int w[100];//记录权值
// char ch[100];//记录字符
HuffmanTree HT = NULL;
char HC[100][100];
n = 28;
char ch[28] = { ' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int w[28] = { 186,64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1};
char zf[100];
gets_s(zf);
char bm[200], lk[100];
gets_s(bm);
HuffmanCoding(HT, HC, w, n);
printf("霍夫曼的字符编码:\n");
for (i = 1; i <= n; i++)
printf("%c:%s\n", ch[i], HC[i]);
printf("\n");
printf("%s编码后:\n", zf);
for (int c = 0; zf[c] != '\0'; c++) {
for (int b = 1; b <= n; b++) {
if (zf[c] == ch[b]) {
printf("%s", HC[b]);
}
}
}
printf("\n");
printf("\n");
int k = 0, j = 0, o;
printf("%s解码后:\n", bm);
for (int i = 0; bm[i] != '\0'; i++) {
for (o = k, j = 0; o <= i; j++, o++) {
lk[j] = bm[o];
}
lk[j] = '\0';
for (int ii = 1; ii <= n; ii++) {
if (strcmp(lk, HC[ii]) == 0) {
printf("%c", ch[ii]);
k = i + 1;
}
}
}
printf("\n");
return 0;
}
不知道为什么,添加上哈夫曼树的代码就错了。我用的visual studio 2022