鱼C论坛

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

求助

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

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

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

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 23:03:45 | 显示全部楼层
代码中的问题是缺少代码的后半部分,对于Huffman树的构建和Huffman编码的生成没有完整实现。

以下是完整代码的示例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define MAXNUM 50

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

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

  16. int HuffmanCreat(HuffNode *ht, int n) {
  17.     int i, k, min1, min2;
  18.     int lnode, rnode;
  19.     for (i = 0; i < 2 * n - 1; i++) {
  20.         ht[i].parent = -1;
  21.         ht[i].leftchild = -1;
  22.         ht[i].rightchild = -1;
  23.     }

  24.     printf("请输入元素数据和权值:\n");
  25.     for (i = 0; i < n; i++) {
  26.         scanf("%c %d", &ht[i].data, &ht[i].weight);
  27.         getchar(); // 读取换行符
  28.     }

  29.     for (i = n; i < 2 * n - 1; i++) {
  30.         min1 = min2 = MAXNUM;
  31.         lnode = rnode = -1;
  32.         for (k = 0; k <= i - 1; k++) {
  33.             if (ht[k].parent == -1) {
  34.                 if (ht[k].weight < min1) {
  35.                     min2 = min1;
  36.                     rnode = lnode;
  37.                     min1 = ht[k].weight;
  38.                     lnode = k;
  39.                 } else if (ht[k].weight < min2) {
  40.                     min2 = ht[k].weight;
  41.                     rnode = k;
  42.                 }
  43.             }
  44.         }
  45.         ht[lnode].parent = i;
  46.         ht[rnode].parent = i;
  47.         ht[i].leftchild = lnode;
  48.         ht[i].rightchild = rnode;
  49.         ht[i].weight = ht[lnode].weight + ht[rnode].weight;
  50.     }

  51.     return 1;
  52. }

  53. void HuffmanCoding(HuffNode *ht, HuffCode *hc, int n) {
  54.     int i, c, p;
  55.     char code[MAXNUM];
  56.     int start;
  57.     code[n - 1] = '\0';

  58.     for (i = 0; i < n; i++) {
  59.         start = n - 1;
  60.         c = i;
  61.         p = ht[c].parent;
  62.         
  63.         while (p != -1) {
  64.             if (ht[p].leftchild == c) {
  65.                 code[--start] = '0';
  66.             } else {
  67.                 code[--start] = '1';
  68.             }
  69.             c = p;
  70.             p = ht[c].parent;
  71.         }

  72.         strcpy(hc[i].cd, &code[start]);
  73.         hc[i].start = start;
  74.     }
  75. }

  76. int main() {
  77.     int n;
  78.     printf("请输入元素个数:");
  79.     scanf("%d", &n);
  80.     getchar(); // 读取换行符

  81.     HuffNode *ht = (HuffNode *)malloc(sizeof(HuffNode) * (2 * n - 1));
  82.     HuffCode *hc = (HuffCode *)malloc(sizeof(HuffCode) * n);

  83.     HuffmanCreat(ht, n);
  84.     HuffmanCoding(ht, hc, n);

  85.     printf("Huffman编码结果如下:\n");
  86.     for (int i = 0; i < n; i++) {
  87.         printf("%c: %s\n", ht[i].data, &hc[i].cd[hc[i].start]);
  88.     }

  89.     free(ht);
  90.     free(hc);
  91.     return 0;
  92. }
复制代码


运行时,先输入元素个数,然后依次输入每个元素的数据和权值。程序将会输出对应的Huffman编码。例如:

  1. 请输入元素个数:5
  2. 请输入元素数据和权值:
  3. A 4
  4. B 6
  5. C 8
  6. D 10
  7. E 12
  8. Huffman编码结果如下:
  9. A: 100
  10. B: 101
  11. C: 11
  12. D: 01
  13. E: 00
复制代码


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 00:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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