qpwoeiruyt 发表于 2019-2-20 01:29:51

人造人 发表于 2019-2-19 18:19
我还是没有问到我需要的内容,我举个例子

下面这个程序


a:001
b:01
c:1

这样子啊但上面的001 01 1是我随便写的 正确的要写完huffman code才能显示出来

人造人 发表于 2019-2-20 01:49:27

qpwoeiruyt 发表于 2019-2-20 01:29
a:001
b:01
c:1


嗯,要的就是这个
我需要研究研究

人造人 发表于 2019-2-20 02:11:10

我看懂这个代码了,但是我没办法做到只是修改huffman_code函数
我可以随意修改这个代码,是吧?

qpwoeiruyt 发表于 2019-2-20 02:23:08

人造人 发表于 2019-2-19 19:11
我看懂这个代码了,但是我没办法做到只是修改huffman_code函数
我可以随意修改这个代码,是吧?

可以

人造人 发表于 2019-2-20 03:30:26

这棵树已经创建好了,时间不早了,先睡了,睡醒以后再想如何得到你想要的输出

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DATA_SIZE 256

typedef struct noeud_tag
{
        char ch;
        size_t freq;
        struct noeud_tag *fils_g;        // 左枝点
        struct noeud_tag *fils_d;        // 右枝点
} noeud_t;

// 能不改的函数尽量不改
void frequence(int *freq, char *chaine)                // 此函数是为了找出字符串里每个ASCII字符的频率
{
        char car;
        int i;
        int length;

        // 计算字符串的长度
        length = strlen(chaine);

        //建立一个表格 现在频率全是0
        for(i = 0; i < 256; i++)
        {
                freq = 0;
        }

        // 计算字符串里每个字母的频率
        for(i = 0; i < length; i++)
        {
                car = chaine;
                freq++;
        }

        return;
}

// 重写此函数
size_t init_tab_noeud(noeud_t *data, int *freq)
{
        size_t index = 0;
        for(size_t i = 0; i < DATA_SIZE; ++i)
        {
                if(freq > 0)
                {
                        memset(&data, 0, sizeof(data));
                        data.ch = (char)i;
                        data.freq = freq;
                        ++index;
                }
        }

        return index;
}

// 按频率从小到大排序
void sort(noeud_t *data, size_t length)
{
        for(size_t i = 0; i < length; ++i)
        {
                for(size_t j = i + 1; j < length; ++j)
                {
                        if(data.freq > data.freq)
                        {
                                noeud_t tmp = data;
                                data = data;
                                data = tmp;
                        }
                }
        }
}

noeud_t *huffman_code(noeud_t *data, size_t length)
{
        size_t index = DATA_SIZE;        // 指向最后一个可用位置
        while(length != 1)
        {
                sort(data, length);

                data[--index] = data;
                data[--index] = data;

                memset(&data, 0, sizeof(data));
                data.fils_g = &data;
                data.fils_d = &data;
                data.freq = data.fils_g->freq + data.fils_d->freq;

                for(size_t i = 1; i < length - 1; ++i)
                        data = data;
                --length;
        }
        return &data;
}

void preorder_traversal(noeud_t *root)
{
        if(root)
        {
                printf("\nch:\t\'%c\'\n", root->ch);
                printf("pre:\t%u\n", root->freq);
                preorder_traversal(root->fils_g);
                preorder_traversal(root->fils_d);
        }
}

// 尽量保证和原来一样,这里也使用数组
// 说真的,数组很不好用
// 为了和原来尽量一样,不得不用
int main(void)
{
        char *chaine = "aaababaaababbbbbbbbbbbbabcddddbcaaabbbbbbbbbbbabbaa";
        int freq;
        size_t length;
        noeud_t data;
        noeud_t *racine;

        frequence(freq, chaine);
        length = init_tab_noeud(data, freq);
        racine = huffman_code(data, length);
        preorder_traversal(data);

        return(EXIT_SUCCESS);
}



ch:   ' '
pre:    51

ch:   ' '
pre:    21

ch:   ' '
pre:    6

ch:   'c'
pre:    2

ch:   'd'
pre:    4

ch:   'a'
pre:    15

ch:   'b'
pre:    30
请按任意键继续. . .

qpwoeiruyt 发表于 2019-2-20 14:10:23

人造人 发表于 2019-2-19 20:30
这棵树已经创建好了,时间不早了,先睡了,睡醒以后再想如何得到你想要的输出

大佬辛苦了   早点休息

人造人 发表于 2019-2-20 16:51:12

好了

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DATA_SIZE        256
#define CODE_TABLE_SIZE        256

typedef struct noeud_tag
{
        char ch;
        size_t freq;
        struct noeud_tag *fils_g;        // 左枝点
        struct noeud_tag *fils_d;        // 右枝点
} noeud_t;

typedef struct
{
        char code;
} code_item_t;

// 能不改的函数尽量不改
void frequence(int *freq, char *chaine)                // 此函数是为了找出字符串里每个ASCII字符的频率
{
        char car;
        int i;
        int length;

        // 计算字符串的长度
        length = strlen(chaine);

        //建立一个表格 现在频率全是0
        for(i = 0; i < 256; i++)
        {
                freq = 0;
        }

        // 计算字符串里每个字母的频率
        for(i = 0; i < length; i++)
        {
                car = chaine;
                freq++;
        }

        return;
}

// 重写此函数
size_t init_noeud(noeud_t *data, int *freq)
{
        size_t index = 0;
        for(size_t i = 0; i < DATA_SIZE; ++i)
        {
                if(freq > 0)
                {
                        memset(&data, 0, sizeof(data));
                        data.ch = (char)i;
                        data.freq = freq;
                        ++index;
                }
        }

        return index;
}

// 按频率从小到大排序
void sort(noeud_t *data, size_t length)
{
        for(size_t i = 0; i < length; ++i)
        {
                for(size_t j = i + 1; j < length; ++j)
                {
                        if(data.freq > data.freq)
                        {
                                noeud_t tmp = data;
                                data = data;
                                data = tmp;
                        }
                }
        }
}

noeud_t *huffman_tree(noeud_t *data, size_t length)
{
        size_t index = DATA_SIZE;        // 指向最后一个可用位置
        while(length != 1)
        {
                sort(data, length);

                data[--index] = data;
                data[--index] = data;

                memset(&data, 0, sizeof(data));
                data.fils_g = &data;
                data.fils_d = &data;
                data.freq = data.fils_g->freq + data.fils_d->freq;

                for(size_t i = 1; i < length - 1; ++i)
                        data = data;
                --length;
        }
        return &data;
}

void preorder_traversal(noeud_t *root)
{
        if(root)
        {
                printf("\nch:\t\'%c\'\n", root->ch);
                printf("pre:\t%u\n", root->freq);
                preorder_traversal(root->fils_g);
                preorder_traversal(root->fils_d);
        }
}

void traverse_tree(noeud_t *root, code_item_t *code_table, char code, size_t index)
{
        if(!root->fils_g && !root->fils_d)
        {
                code = '\0';
                strcpy(code_table.code, code);
        }
        if(root->fils_g)
        {
                code = '0';
                traverse_tree(root->fils_g, code_table, code, index + 1);
        }
        if(root->fils_d)
        {
                code = '1';
                traverse_tree(root->fils_d, code_table, code, index + 1);
        }
}

void init_code_table(code_item_t *code_table, noeud_t *code_tree)
{
        char code;
        size_t index = 0;
        memset(code_table, 0, sizeof(code_item_t) * CODE_TABLE_SIZE);
        traverse_tree(code_tree, code_table, code, index);
}

// 尽量保证和原来一样,这里也使用数组
// 说真的,数组很不好用
// 为了和原来尽量一样,不得不用
int main(void)
{
        char *chaine = "aaababaaababbbbbbbbbbbbabcddddbcaaabbbbbbbbbbbabbaa";
        int freq;
        size_t length;
        noeud_t data;
        noeud_t *code_tree;
        code_item_t code_table;

        frequence(freq, chaine);
        length = init_noeud(data, freq);
        code_tree = huffman_tree(data, length);
        init_code_table(code_table, code_tree);

        printf("a: %s\n", code_table['a'].code);
        printf("b: %s\n", code_table['b'].code);
        printf("c: %s\n", code_table['c'].code);
        printf("d: %s\n", code_table['d'].code);

        preorder_traversal(code_tree);
        return(EXIT_SUCCESS);
}


a: 01
b: 1
c: 000
d: 001

ch:   ' '
pre:    51

ch:   ' '
pre:    21

ch:   ' '
pre:    6

ch:   'c'
pre:    2

ch:   'd'
pre:    4

ch:   'a'
pre:    15

ch:   'b'
pre:    30
请按任意键继续. . .

qpwoeiruyt 发表于 2019-2-20 19:54:35

人造人 发表于 2019-2-20 09:51
好了

谢谢啦问一下最后那个图是怎样打印出来的?

人造人 发表于 2019-2-20 20:04:58

qpwoeiruyt 发表于 2019-2-20 19:54
谢谢啦问一下最后那个图是怎样打印出来的?

用PPT自己画的
^_^

人造人 发表于 2019-2-20 20:05:35

qpwoeiruyt 发表于 2019-2-20 19:54
谢谢啦问一下最后那个图是怎样打印出来的?

qpwoeiruyt 发表于 2019-2-21 14:37:26

人造人 发表于 2019-2-20 13:05


谢谢啦   大神的code能不能写点注释进去有一些你写的东西不是太清楚 就是每个函数前头简单解释一下我就会了

人造人 发表于 2019-2-21 14:42:53

qpwoeiruyt 发表于 2019-2-21 14:37
谢谢啦   大神的code能不能写点注释进去有一些你写的东西不是太清楚 就是每个函数前头简单解释一下我就 ...

哪个函数看不懂?
^_^

qpwoeiruyt 发表于 2019-2-22 00:15:21

人造人 发表于 2019-2-21 07:42
哪个函数看不懂?
^_^

大致都懂了

现在又来了个新问题

大佬会用flex编写词法分析器吗?写了个逆波兰表达式的c文件 如何将它写成flex呢? 里面的结构看上去挺相近的

人造人 发表于 2019-2-22 00:38:55

qpwoeiruyt 发表于 2019-2-22 00:15
大致都懂了

现在又来了个新问题


加我qq:1440332527
我没试过,不过可以研究研究
^_^

qpwoeiruyt 发表于 2019-2-22 00:40:21

人造人 发表于 2019-2-21 17:38
加我qq:1440332527
我没试过,不过可以研究研究
^_^

大佬有微信吗?qq忘了密码 现在一直用微信

人造人 发表于 2019-2-22 00:41:33

qpwoeiruyt 发表于 2019-2-22 00:40
大佬有微信吗?qq忘了密码 现在一直用微信

没有微信,我一直用qq
我的微信密码忘了
^_^

人造人 发表于 2019-2-22 00:45:25

qpwoeiruyt 发表于 2019-2-22 00:15
大致都懂了

现在又来了个新问题


那就在这里说吧
详细描述一下这个问题
页: 1 [2]
查看完整版本: 哈夫曼码结构体的疑问