(Q
)
nota: junto com o texto codificado tem que guardar a árvore de huffman.
Faça uma função que leia o texto do stdin e construa a tabela de frequências sabendo que o texto pode conter qualquer simbolo do código ascci.
Use a seguinte tabela:
int freq[256];
int freq[256];
).
Pode usar o seguinte tipo para representar a árvore de huffman:
struct ab{ int freq; char s; struct ab *esq; struct ab *dir; };Nota: Cada simbolo com frequência diferente de 0 deve ser introduzido, por exemplo num vector (ex:
struct tabela codigos[256];
) ordenado (decrescente) pela frequência do simbolo. A sua função deve retirar as árvores com menor frequência e juntá-las numa e inserir a nova árvore na estrura ordenada (ex:vector).
Este procedimento deve ser repetido até só existir uma árvore na estrutura.
struct tabela{char *codigo; int numbits;}; struct tabela codigos[256];
Nota: para fazer um shift para a esquerda basta multiplicar por 2 ou usar o operador
ex:
unsigned char x=1; /* x=0000 0001 em binário*/ x=x*2; ou x = x <<1; /* x=0000 0010 em binário*/
Se a codificação do seu texto não for um multiplo de 8 não se preocupe, apesar de no stdout só poder escrever palavras com um minimo de 8 bits.