鱼C论坛

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

求助

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

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

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

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

typedef struct
{
        char data;
        int weight;
        int parent;
        int leftchild;
        int rightchild;
}HuffNode;

typedef struct
{
        char cd[MAXNUM];
        int start;
}HuffCode; 

int HaffmanCreat(HuffNode *ht)
{
        int i,k,n,min1,min2,lnode,rnode;
        printf("请输入元素个数:");
        scanf("%d",&n);
        for(i=1;i<=n;i++)            //输入结点值和信息 
        {
                getchar();
                printf("第%d个元素的=>\n\t结点值:",i);
                scanf("%c",&ht[i].data);
                printf("\t权重:");
                scanf("%d",&ht[i].weight);
        }
        for(i=1;i<=2*n-1;i++)       //对数组初始化 
        {
                ht[i].parent=0;
                ht[i].leftchild=0;
                ht[i].rightchild=0;
        }
        for(i=n+1;i<=2*n-1;i++)
        {
                min1=min2=32767;
                lnode=1;
                rnode=1;
                for(k=1;k<=i-1;k++)  //从数组中找权值最小的两个结点 
                        if(ht[k].parent==0)        //在尚未参与构造的结点中找
                                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[i].weight=min1+min2;
                        ht[i].leftchild=lnode;
                        ht[i].rightchild=rnode;
                        ht[lnode].parent=i;
                        ht[rnode].parent=i;
        }
        printf("哈夫曼树已成功建立!\n");
        return n;
}

void PrintBTNode(HuffNode *hf, int index,int n)    //横向输出 
{
        if(hf[index].leftchild!=0||hf[index].rightchild!=0)
        {
                PrintBTNode(hf,hf[index].rightchild,n+1);
                if(n!=0)
                {
                        for(int i=0;i<4*(n-1);i++)
                        {
                                printf("%s"," ");
                        }
                        printf("%s","---");
                }
                printf("o\n");
                PrintBTNode(hf,hf[index].leftchild,n+1);
        }
        else
        {
                if(n!=0)
                {
                        for(int i=0;i<4*(n-1);i++)
                        {
                                printf("%s"," ");
                        }
                        printf("%s","---");
                }
                printf("%c \n",hf[index].data);
        }
}

void Encoding(HuffNode ht[],HuffCode hcd[],int n)  //哈夫曼编码 
{
        HuffCode d;
        int i,k,f,c;
        for(i=1;i<=n;i++)
        {
                d.start=n+1;
                c=i;
                f=ht[i].parent;
                while(f!=0)
                {
                        if(ht[f].leftchild==c)
                                d.cd[--d.start]='0';
                        else
                                d.cd[--d.start]='1';
                        c=f;
                        f=ht[f].parent;
                }
                hcd[i]=d;
        }
        printf("输出哈夫曼编码:\n");
        for(i=1;i<=n;i++)
        {
                printf("%c:",ht[i].data);
                for(k=hcd[i].start;k<=n;k++)
                        printf("%c",hcd[i].cd[k]);
                printf("\n");
        }
}

int main()
{
        HuffNode *ht;
        HuffCode *hcd;
        int n;
        ht=(HuffNode *)malloc(sizeof(HuffNode));
        hcd=(HuffCode *)malloc(sizeof(HuffCode));
        n=HaffmanCreat(ht);
        PrintBTNode(ht,2*n-1,0);
        Encoding(ht,hcd,n);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-25 23:03:45 | 显示全部楼层
代码中的问题是缺少代码的后半部分,对于Huffman树的构建和Huffman编码的生成没有完整实现。

以下是完整代码的示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXNUM 50

typedef struct {
    char data;
    int weight;
    int parent;
    int leftchild;
    int rightchild;
} HuffNode;

typedef struct {
    char cd[MAXNUM];
    int start;
} HuffCode;

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

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

    for (i = n; i < 2 * n - 1; i++) {
        min1 = min2 = MAXNUM;
        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 = i;
        ht[i].leftchild = lnode;
        ht[i].rightchild = rnode;
        ht[i].weight = ht[lnode].weight + ht[rnode].weight;
    }

    return 1;
}

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

    for (i = 0; i < n; i++) {
        start = n - 1;
        c = i;
        p = ht[c].parent;
        
        while (p != -1) {
            if (ht[p].leftchild == c) {
                code[--start] = '0';
            } else {
                code[--start] = '1';
            }
            c = p;
            p = ht[c].parent;
        }

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

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

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

    HuffmanCreat(ht, n);
    HuffmanCoding(ht, hc, n);

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

    free(ht);
    free(hc);
    return 0;
}

运行时,先输入元素个数,然后依次输入每个元素的数据和权值。程序将会输出对应的Huffman编码。例如:
请输入元素个数:5
请输入元素数据和权值:
A 4
B 6
C 8
D 10
E 12
Huffman编码结果如下:
A: 100
B: 101
C: 11
D: 01
E: 00

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-18 21:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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