数据结构 - 赫夫曼编码的存储表示和实现

1.采用书上第147页定义的赫夫曼树和赫夫曼编码的存储表示,编程实现从叶子到根逆向求赫夫曼编码和从根到叶子求赫夫曼编码

11.1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _for(i, a, b) for (int i = (a); i < (b); ++i)
#define sc scanf
#define pr printf
typedef struct node
{
    int key;
    struct node *l;
    struct node *r;
} node, *pnode;
int mark[100];
struct node huffman[100];
inline void PrintNode(const pnode node)
{
    pr("key = %d \n", node->key);
}
void PreOrder(pnode T)
{
    if (T)
    {
        PrintNode(T);
        PreOrder(T->l);
        PreOrder(T->r);
    }
}
void Select(int *mark, node *huffman, int size, int *choose)
{
    int i;
    for (i = 0; i < size; ++i)
        if (mark[i])
        {
            choose[0] = i;
            i++;
            break;
        }
    choose[1] = choose[0];
    for (; i < size; ++i)
        if (mark[i])
        {
            if (huffman[choose[0]].key >= huffman[i].key)
            {
                choose[1] = choose[0];
                choose[0] = i;
            }
            else if (huffman[choose[1]].key > huffman[i].key)
            {
                choose[1] = i;
            }
        }
}
#define leftnode mynode->l
#define rightnode mynode->r
pnode HuffmanTree(int *mark, struct node *huffman, int size)
{
    int choose[2];
    pnode mynode;
    _for(i, 0, size - 1)
    {
        Select(mark, huffman, size, choose);
        mynode = (pnode)malloc(sizeof(node));
        mynode->key = huffman[choose[0]].key + huffman[choose[1]].key;
        leftnode = (pnode)malloc(sizeof(node));
        *leftnode = huffman[choose[0]];
        rightnode = &huffman[choose[1]];
        huffman[choose[0]] = *mynode;
        mark[choose[1]] = 0;
        free(mynode);
    }
    return &huffman[choose[0]];
}
inline void Init()
{
    memset(mark, -1, sizeof(mark));
    memset(huffman, 0, sizeof(huffman));
}
int main()
{
    int key[8] = {5, 29, 7, 8, 14, 23, 3, 11};
    int i;
    pnode huffmantree;
    Init();
    _for(i, 0, 8)
        huffman[i]
            .key = key[i];
    huffmantree = HuffmanTree(mark, huffman, 8);
    PreOrder(huffmantree);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值