aaayhy 2020-02-14 14:13 采纳率: 0%
浏览 506

请问要怎么释放哈夫曼编码里面w.Weight与w.ch的动态分配的空间(后面的代码里面标记的地方系统说操作数类型不兼容(int 和int *,int和char*)想问下该怎么修改?)

#include
#include "malloc.h"
#include
#include
#define MAX 65535
typedef struct{
unsigned int Weight;
unsigned int Parent, LChild, RChild;
}HuffmanTreeNode, HuffmanTree;
typedef struct{
char *ch; //动态分配空间,用来储存待编码的字符
int *Weight; //动态分配空间,用来储存待编码的字符的相应权重
int Count; //动态分配空间,用来储存待编码的字符
}WeightAndInfo;
//待编码字符的个数
typedef char *
HuffmanCode;
void CreateHuffmanTree_Code(HuffmanTree *HT, HuffmanCode *HC, int *w, int n);
void Select(HuffmanTree HT, int i, int *s1, int *s2);
//在HT中选择Parent为0且Weight最小的两个结点,其序号分别为s1和s2
int main()
{
HuffmanCode chCode;
int i;
HuffmanTree HufTree = NULL;
WeightAndInfo w;
printf("请分别输入待编码字符的个数和待编码字符及权重:\n");
scanf_s("%d\n", &w.Count); //输入待编码字符的个数
//为指向哈夫曼编码的空间的头指针分配空间
chCode = (HuffmanCode)malloc((w.Count + 1)*sizeof(char *));
//为待编码的字符的权重分配空间
w.Weight = (int *)malloc(w.Count*sizeof(int));
w.ch = (char *)malloc(w.Count*sizeof(char)); //为待编码字符分配空间
for (i = 0; i < w.Count; i++)
{
scanf_s("%d,%c", &(w.Weight[i]), &(w.ch[i]));
} //输入待编码的字符及相应权重
//创建哈夫曼树及哈夫曼编码
CreateHuffmanTree_Code(&HufTree, &chCode, w.Weight, w.Count);
for (i = 1; i < w.Count; i++)
printf("待编码的字符 ch 是 %c,对应的权重Weight为 %d,相应的哈夫曼编码 code为 %s\n", w.ch[i - 1], w.Weight[i - 1], chCode[i]);
int getch(void); //?
for (i = 1; i <= w.Count; i++) //释放动态分配的内存
if (chCode[i]) free(chCode[i]);
free(chCode);//一些动态分配的空间没有被释放如w.Weight、w.ch等,请补充完整……
//从这里开始是我按照上面的弄的
for (i = 1; i <= w.Weight; i++) //释放动态分配的内存
if (chCode[i]) free(chCode[i]);
free(chCode);
for (i = 1; i <= w.ch; i++) //释放动态分配的内存
if (chCode[i]) free(chCode[i]);
free(chCode);
//到这里麻烦大佬们帮我看看
}
void CreateHuffmanTree_Code(HuffmanTree *HT, HuffmanCode *HC, int *w, int n)
{
//创建哈夫曼树及求哈夫曼编码
int m, s1, s2, i, c, start, f;
char *cd;
HuffmanTree p;
if (n < 1) return;
m = 2 * n - 1;
(*HT) = (HuffmanTree)malloc((m + 1)*sizeof(HuffmanTreeNode));
for (p = *HT, i = 1; i <= n; i++)
{
p[i].Weight = w[i - 1];
p[i].Parent = 0;
p[i].LChild = 0;
p[i].RChild = 0;
}
for (; i <= m; i++)
{
p[i].Weight = 0;
p[i].Parent = 0;
p[i].LChild = 0;
p[i].RChild = 0;
}
for (i = n + 1; i <= m; i++)
{
Select(*HT, i - 1, &s1, &s2);
(*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;
}
cd = (char *)malloc(n*sizeof(char));
cd[n - 1] = '\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));
strcpy_s((*HC)[i], 99, &cd[start]);
}
free(cd);
}
void Select(HuffmanTree HT, int i, int *s1, int *s2)
{
//在HT中选择Parent为0且Weight最小的两个结点,其序号分别为s1和s2
int j;
int min;
min = MAX;
for (j = 1; j <= i; j++)
{
if (HT[j].Parent == 0 && HT[j].Weight <= min)
{
*s1 = j;
min = HT[j].Weight;
}
}
HT[*s1].Parent = *s1;
min = MAX;
for (j = 1; j <= i; j++)
{
if (HT[j].Parent == 0 && HT[j].Weight <= min)
{
*s2 = j;
min = HT[j].Weight;
}
}
HT[*s2].Parent = *s2; system("pause");
}//CreateHuffmanTree_Code

  • 写回答

2条回答 默认 最新

  • aaayhy 2020-02-14 23:03
    关注

    我朋友的同学帮我解决啦!这里说一下解决方法:只要把文中标记地方的Weight和ch强制转化类型就行了!具体方法如下:
    将:
    for (i = 1; i <= w.Weight; i++) //释放动态分配的内存
    if (chCode[i]) free(chCode[i]);
    free(chCode);
    for (i = 1; i <= w.ch; i++) //释放动态分配的内存
    if (chCode[i]) free(chCode[i]);
    free(chCode);
    改为:
    for (i = 1; i <= (int)w.Weight; i++) //释放动态分配的内存
    if (chCode[i]) free(chCode[i]);
    free(chCode);
    for (i = 1; i <= (char)w.ch; i++) //释放动态分配的内存

    希望可以帮助到你们!
    if (chCode[i]) free(chCode[i]);
    free(chCode);

    评论

报告相同问题?

悬赏问题

  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable