Jack_WJQ 2018-12-22 23:10 采纳率: 0%
浏览 932

C/C++ char类型指针数组输入问题

C/C++ char类型指针数组输入问题

数据结构课程设计,要求从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上。
程序代码如下:

#include <iostream>
#include <string.h>
#define N 50
#define M 2*N-1
#define MAX 100
using namespace std;

typedef struct {
    char data[5];
    int weight;
    int parent;
    int lchild;
    int rchild;
}HTNode;
typedef struct {
    char cd[N];
    int start;
}HCode;

void CreatHT(HTNode ht[], int n) {
    int i,k,lnode,rnode;
    int min1,min2;
    for (i=0; i<2*n-1; i++) {
        ht[i].parent=ht[i].lchild=ht[i].rchild=-1;
    }
    for (i=n; i<2*n-1; i++) {
        min1=min2=32767;
        lnode=rnode=-1;
        for (k=0; k<=i-1; k++) {
            if (ht[k].parent==-1) {
                if (ht[k].weight<min1) {
                    min2=min1;
                    rnode=lnode;
                    min1=ht[k].weight;
                    lnode=k;
                }
                else if (ht[k].weight<min2) {
                    min2=ht[k].weight;
                    rnode=k;
                }
            }
        }
        ht[lnode].parent=i;
        ht[rnode].parent=1;
        ht[i].weight=ht[lnode].weight+ht[rnode].weight;
        ht[i].lchild=lnode;
        ht[i].rchild=rnode;
    }
}
void CreatHCode(HTNode ht[], HCode hcd[], int n) {
    int i,f,c;
    HCode hc;
    for (i=0; i<n; i++) {
        hc.start=n;
        c=i;
        f=ht[i].parent;
        while (f!=-1) {
            if (ht[f].lchild==c) {
                hc.cd[hc.start--]='0';
            }
            else {
                hc.cd[hc.start--]='1';
            }
            c=f;
            f=ht[f].parent;
        }
        hc.start++;
        hcd[i]=hc;
    }
}
void DispHCode(HTNode ht[], HCode hcd[], int n) {
    int i,k;
    int sum=0,m=0,j;
    printf("输出哈弗曼编码:\n");
    for (i=0; i<n; i++) {
        j=0;
        printf("    %s:\t", ht[i].data);
        for (k=hcd[i].start; k<=n; k++) {
            printf("%c", hcd[i].cd[k]);
            j++;
        }
        m+=ht[i].weight;
        sum+=ht[i].weight*j;
    }
    printf("\n平均长度=%g\n", 1.0*sum/m);
}

int main(int argc, const char * argv[]) {
    // insert code here...
    int n,i;
    char *str[MAX];//这里定义了一个指针数组存放哈夫曼编码
    int fnum[MAX];
    HTNode ht[M];
    HCode hcd[N];
    printf("输如字符集大小:");
    scanf("%d", &n);
    printf("输入%d个字符:", n);
    for (i=0; i<n; i++) {
        scanf("%s", str[i]);//这里的输入应该如何修改?
    }
    printf("输入%d个权值:", n);
    for (i=0; i<n; i++) {
        scanf("%d", &fnum[i]);
    }
    for (i=0; i<n; i++) {
        strcpy(ht[i].data, str[i]);
        ht[i].weight=fnum[i];
    }
    CreatHT(ht, n);
    CreatHCode(ht, hcd, n);
    DispHCode(ht, hcd, n);
    return 1;
}

有问题的地方已在主函数中注释,其他的函数都是哈夫曼树的基本算法。
困扰许久求大佬解决!

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-09 15:23
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿