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

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

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

 

...全文
117 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文详细介绍了利用Simulink进行变压器开路试验的电路连接配置与仿真实现方法,重点在于通过仿真手段还原实际电力系统中变压器在空载条件下的电气特性,从而深入理解其工作原理与性能表现。文章作为电力系统仿真系列研究的一部分,系统阐述了从电路模型搭建、参数设定、仿真运行到结果分析的完整流程,突出展示了MATLAB/Simulink在电力设备建模与教学科研中的强大功能与应用价值。; 适合人群:具备电力系统基础知识,熟悉MATLAB/Simulink仿真环境,从事电气工程、自动化及相关领域的研发人员,以及高年级本科生和研究生。; 使用场景及目标:①掌握变压器开路试验的基本原理与Simulink仿真建模的具体步骤;②通过仿真实验深入理解空载电流、铁芯损耗及励磁特性等关键参数的物理意义;③为后续开展变压器短路试验、暂态过程分析以及其他电力设备的仿真研究奠定理论与实践基础。; 阅读建议:建议结合Simulink软件动手实践,逐步构建并调试电路模型,重点关注各元件参数的设置方法与测量模块的应用技巧,同时推荐参考文中提及的其他相关仿真案例进行拓展学习,以全面提升对电力系统仿真实践的整体认知与操作能力。

67,946

社区成员

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

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

你们学习,我来评分

每周最高分送一本书

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

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

 

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