哈夫曼编码总报错怎么办,求各位大佬解答!!

Ghurnid_ 2024-11-07 21:34:16

#include<iostream>
using namespace std;
typedef struct{
    char data;
    double weight;
    int parent, lchild, rchild;
}HTNode,*HaffmanTree;
typedef char** Code;

void Compare(HaffmanTree HT, int& s1, int& s2, int n) {
    int i, t;
    double min=100000;
    for (i = 1; i <= n; i++)
        if (HT[i].parent == 0 && min > HT[i].weight) {
            min = HT[i].weight;
            s1 = i;
        }
    t = HT[s1].parent;
    HT[s1].parent = -1;
    min = 100000;
    for (i = 1; i <= n; i++)
        if (HT[i].parent == 0 && min > HT[i].weight) {
            min = HT[i].weight;
            s2 = i;
        }
    HT[s1].parent = t;
}

void CreateTree(HaffmanTree &HT,int n) {//构造哈夫曼树
    HT = new HTNode[2*n];
    int i,j,s1,s2;
    cout << "输入节点信息:";
    for (i = 1; i <= n; i++) 
        cin >> HT[i].data;
    cout << "依次输入权值:";
    for (i = 1; i <= n; i++) {
        cin >> HT[i].weight;
        HT[i].parent = 0;
        HT[i].lchild = 0;
        HT[i].rchild = 0;
    }
    for (i = n+1; i <= 2 * n + 1; i++) {
        Compare(HT, s1, s2, i-1);
        HT[i].lchild = s1;
        HT[i].rchild = s2;
        HT[i].weight = HT[s1].weight + HT[s2].weight;
        HT[s1].parent = i;
        HT[s2].parent = i;
    }
}

void CreateCode(HaffmanTree HT, int n,Code &code) {//编码
    int i, j;
    code = new char* [n + 1];
    for (i = 1; i <= n; i++) {
        j = 0;
        int p = HT[i].parent;
        int c = i;
        while (p != 0) {
            if (HT[p].lchild == c)
                code[i][j] = '0';
            else
                code[i][j] = '1';
            j++;
            c = p;
            p = HT[p].parent;
        }
        code[i][j] = '\0';
        for (int k = 0; k < j; k++) {
            int t = code[i][k];
            code[i][k] = code[i][j - k - 1];
            code[i][j - k - 1] = t;
        }
    }
}

int WPL(HaffmanTree HT,int n,char **code) {
    int i,j=0;
    int wpl = 0;
    for (i = 1; i <= n; i++) {
        while (code[i][j] != '\0')
            j++;
        wpl = wpl + HT[i].weight * (j + 1);
    }
    return wpl;
}

int main() {
    HaffmanTree HT;
    Code code;
    int n;
    cout << "输入结点个数:";
    cin >> n;
    CreateTree(HT, n);
    CreateCode(HT, n,code);
    for (int i = 1; i <= n; i++)
        cout << HT[i].data<<code[i]<<endl;
    int wpl = WPL(HT, n, code);
    cout << "wpl=" << wpl;
    return 0;
}

为什么哈夫曼编码时总是会报错 ,求解!!!

 

...全文
119 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

67,946

社区成员

发帖
与我相关
我的任务
社区描述
灌水发信息每周送书 灌水发干货每周送惊喜 谁最水过年送大礼 谁最硬核过年送大礼 谁最贡献过年送大礼
社区管理员
  • 1_bit
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

我们“新手村”社区就是大家的孵化器

你们学习,我来评分

每周最高分送一本书

每月第四周送一份机械键盘

咱们新手村使用一切狂暴手段让优秀的人得到奖励

 

试试用AI创作助手写篇文章吧