ramshadom 2016-06-03 09:12 采纳率: 71.4%
浏览 1111
已采纳

霍夫曼编码的指针快要搞死我了

还是在学数据结构。要写霍夫曼编码了。以下我就直接po全套代码


 #include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;

typedef char **HuffmanCode;
typedef struct
{
    int weight;
    int parent, lchild, rchild;
}HTNode, *HuffmanTree;

void InsertSearch(HuffmanTree &HT, int n)
{
    int i, j;
    for (i = 2; i <=n ; ++i)
    {
        if (HT[i].weight < HT[i -1].weight)
        {
            HT[0] = HT[i];
            HT[i] = HT[i - 1];
            for (j = i - 2; HT[0].weight < HT[j].weight; --j)
                HT[j + 1] = HT[j];
            HT[j + 1] = HT[0];
        }
    }
}

void Select(HuffmanTree &HT, int area, int &s1, int &s2)
{
    int i, flag = 1;
    for (i = 1; (i <= area) || (flag == 1); i++)
    {
        if (HT[i].parent = 0)
        {
            s1 = i;
            s2 = i + 1;
            flag = 0;
        }
        else continue;
    }
}

void CreateHuffmanTree(HuffmanTree &HT, int n)
{
    int m, i, s1, s2;
    if (n <= 1)
        return;
    m = 2 * n - 1;
    HT = new HTNode[m + 1];
    for (i = 1; i <= m; ++i)
    {
        HT[i].parent = 0; 
        HT[i].lchild = 0; 
        HT[i].rchild = 0;
    }
    for (i = 1; i <= n; ++i)
        cin >> HT[i].weight;

    InsertSearch(HT, n);

    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;
    }
}

void CreateHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n)
{
    int i, c, start, f;
    char *cd;
    cd = new char[n];
    cd[n - 1] = '\0';
    for (i = 1; i <= n; ++i)
    {
        start = n - 1;
        c = i; f = HT[i].parent;
        while (f != 0)
        {
            --start;
            if (HT[f].lchild == 0)
                cd[start] = '0';
            else
                cd[start] = '1';
            c = f;
            f = HT[f].parent;
        }
        HC[i] = new char[n - start];
        strcpy_s(HC[i], 20, &cd[start]);
    }
    delete cd;
}


int main()
{
    int n;
    cout << "请输入 即将输入的叶子节点个数" << endl;
    cin >> n;
    HuffmanTree *HT = new char *[n + 1];
    HuffmanCode *HC = new char *[n + 1];
    CreateHuffmanTree(*HT, n);
    CreateHuffmanCode(*HT, *HC, n);
}


问题出在main函数构建HT 和 HC上。po图


图片说明


图片说明

救救我吧,快被指针搞死啦

  • 写回答

2条回答 默认 最新

  • 小灸舞 2016-06-03 12:28
    关注
     new char *[n + 1]返回的是char **
      HuffmanTree *HT是HTNode**类型的
        两边类型不匹配的
    

    不知道楼主到底是要干嘛?

    代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
    提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
    单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置