sherlock11111 2022-06-11 20:40 采纳率: 0%
浏览 31
已结题

vs2022,代码做了窗口,加上哈夫曼树就错了

哪位能帮忙看看我的代码,大一,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

  • 写回答

2条回答 默认 最新

  • 浩宇哈哈哈哈 2022-06-13 10:19
    关注
    • p->weight = w; 这一行改成 p->weight = *w;
    • cd = (char)malloc(n * sizeof(char)); //分配求编码的工作空间 这一行改成 cd = (char *)malloc(n * sizeof(char));
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月14日
  • 创建了问题 6月11日

悬赏问题

  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办