鱼C论坛

 找回密码
 立即注册
查看: 910|回复: 1

求助

[复制链接]
发表于 2024-5-25 22:58:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MAXNUM 50

  4. typedef struct
  5. {
  6.         char data;
  7.         int weight;
  8.         int parent;
  9.         int leftchild;
  10.         int rightchild;
  11. }HuffNode;

  12. typedef struct
  13. {
  14.         char cd[MAXNUM];
  15.         int start;
  16. }HuffCode;

  17. int HaffmanCreat(HuffNode *ht)
  18. {
  19.         int i,k,n,min1,min2,lnode,rnode;
  20.         printf("请输入元素个数:");
  21.         scanf("%d",&n);
  22.         for(i=1;i<=n;i++)            //输入结点值和信息
  23.         {
  24.                 getchar();
  25.                 printf("第%d个元素的=>\n\t结点值:",i);
  26.                 scanf("%c",&ht[i].data);
  27.                 printf("\t权重:");
  28.                 scanf("%d",&ht[i].weight);
  29.         }
  30.         for(i=1;i<=2*n-1;i++)       //对数组初始化
  31.         {
  32.                 ht[i].parent=0;
  33.                 ht[i].leftchild=0;
  34.                 ht[i].rightchild=0;
  35.         }
  36.         for(i=n+1;i<=2*n-1;i++)
  37.         {
  38.                 min1=min2=32767;
  39.                 lnode=1;
  40.                 rnode=1;
  41.                 for(k=1;k<=i-1;k++)  //从数组中找权值最小的两个结点
  42.                         if(ht[k].parent==0)        //在尚未参与构造的结点中找
  43.                                 if(ht[k].weight<min1)
  44.                                 {
  45.                                         min2=min1;
  46.                                         rnode=lnode;
  47.                                         min1=ht[k].weight;
  48.                                         lnode=k;
  49.                                 }
  50.                                 else if(ht[k].weight<min2)
  51.                                 {
  52.                                         min2=ht[k].weight;
  53.                                         rnode=k;
  54.                                 }
  55.                         ht[i].weight=min1+min2;
  56.                         ht[i].leftchild=lnode;
  57.                         ht[i].rightchild=rnode;
  58.                         ht[lnode].parent=i;
  59.                         ht[rnode].parent=i;
  60.         }
  61.         printf("哈夫曼树已成功建立!\n");
  62.         return n;
  63. }

  64. void PrintBTNode(HuffNode *hf, int index,int n)    //横向输出
  65. {
  66.         if(hf[index].leftchild!=0||hf[index].rightchild!=0)
  67.         {
  68.                 PrintBTNode(hf,hf[index].rightchild,n+1);
  69.                 if(n!=0)
  70.                 {
  71.                         for(int i=0;i<4*(n-1);i++)
  72.                         {
  73.                                 printf("%s"," ");
  74.                         }
  75.                         printf("%s","---");
  76.                 }
  77.                 printf("o\n");
  78.                 PrintBTNode(hf,hf[index].leftchild,n+1);
  79.         }
  80.         else
  81.         {
  82.                 if(n!=0)
  83.                 {
  84.                         for(int i=0;i<4*(n-1);i++)
  85.                         {
  86.                                 printf("%s"," ");
  87.                         }
  88.                         printf("%s","---");
  89.                 }
  90.                 printf("%c \n",hf[index].data);
  91.         }
  92. }

  93. void Encoding(HuffNode ht[],HuffCode hcd[],int n)  //哈夫曼编码
  94. {
  95.         HuffCode d;
  96.         int i,k,f,c;
  97.         for(i=1;i<=n;i++)
  98.         {
  99.                 d.start=n+1;
  100.                 c=i;
  101.                 f=ht[i].parent;
  102.                 while(f!=0)
  103.                 {
  104.                         if(ht[f].leftchild==c)
  105.                                 d.cd[--d.start]='0';
  106.                         else
  107.                                 d.cd[--d.start]='1';
  108.                         c=f;
  109.                         f=ht[f].parent;
  110.                 }
  111.                 hcd[i]=d;
  112.         }
  113.         printf("输出哈夫曼编码:\n");
  114.         for(i=1;i<=n;i++)
  115.         {
  116.                 printf("%c:",ht[i].data);
  117.                 for(k=hcd[i].start;k<=n;k++)
  118.                         printf("%c",hcd[i].cd[k]);
  119.                 printf("\n");
  120.         }
  121. }

  122. int main()
  123. {
  124.         HuffNode *ht;
  125.         HuffCode *hcd;
  126.         int n;
  127.         ht=(HuffNode *)malloc(sizeof(HuffNode));
  128.         hcd=(HuffCode *)malloc(sizeof(HuffCode));
  129.         n=HaffmanCreat(ht);
  130.         PrintBTNode(ht,2*n-1,0);
  131.         Encoding(ht,hcd,n);
  132. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-5-25 22:58:43 | 显示全部楼层
您好!看到你的代码,我发现你的问题可能出在scanf函数上。你的代码缺少了头文件,可以在开头添加<cstdio>来包含该函数所在的头文件。

另外,你声明了一个HuffNode类型的数组ht,但是没有给其分配内存空间。你可以使用动态内存分配函数malloc来分配内存。修改代码如下:

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #define MAXNUM 50

  4. typedef struct
  5. {
  6.     char data;
  7.     int weight;
  8.     int parent;
  9.     int leftchild;
  10.     int rightchild;
  11. } HuffNode;

  12. typedef struct
  13. {
  14.     char cd;
  15.     int start;
  16. } HuffCode;

  17. int HaffmanCreat(HuffNode *ht)
  18. {
  19.     int i, k, n, min1, min2, lnode, rnode;
  20.     printf("请输入元素个数:");
  21.     scanf("%d", &n);
  22.     ht = (HuffNode *)malloc(sizeof(HuffNode) * (2 * n - 1));
  23.     for (i = 1; i <= n; i++) {
  24.         printf("请输入第%d个字符和权重:", i);
  25.         scanf(" %c%d", &(ht[i].data), &(ht[i].weight));
  26.         ht[i].parent = 0;
  27.         ht[i].leftchild = 0;
  28.         ht[i].rightchild = 0;
  29.     }
  30.     for (i = n + 1; i < 2 * n - 1; i++) {
  31.         min1 = min2 = MAXNUM;
  32.         lnode = rnode = 0;
  33.         for (k = 1; k <= i - 1; k++) {
  34.             if (ht[k].parent == 0) {
  35.                 if (ht[k].weight < min1) {
  36.                     min2 = min1;
  37.                     rnode = lnode;
  38.                     min1 = ht[k].weight;
  39.                     lnode = k;
  40.                 } else if (ht[k].weight < min2) {
  41.                     min2 = ht[k].weight;
  42.                     rnode = k;
  43.                 }
  44.             }
  45.         }
  46.         ht[lnode].parent = i;
  47.         ht[rnode].parent = i;
  48.         ht[i].weight = ht[lnode].weight + ht[rnode].weight;
  49.         ht[i].leftchild = lnode;
  50.         ht[i].rightchild = rnode;
  51.     }
  52.     return 0;
  53. }

  54. int main()
  55. {
  56.     HuffNode *ht;
  57.     HaffmanCreat(ht);
  58.     return 0;
  59. }
复制代码


这样就修复了你的代码中的错误,并且为ht数组分配了内存空间。希望对你有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-18 21:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表