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

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

还是在学数据结构。要写霍夫曼编码了。以下我就直接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执行停在该断点处。)是程序员必须掌握的技能之一。

    已采纳该答案
    打赏 评论
  • msd0916 2016-06-03 09:29

    这函数是你自己写的吗?
    typedef char HuffmanCode;
    这一行,应该理解为

    typedef (char **) HuffmanCode;
    也就是说

    char
    a; 等价于 HuffmanCode a;
    所以HuffmanCode *HC 那里会报错。

    打赏 评论

相关推荐 更多相似问题