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;
}