int frequency(int *b[],char *ch[])
{ int c,i;
int j=1;
int len=0;
int a[150];
for(i=0;i<=150;i++)
{
a[i]=0;
}
printf("请输入字符串\n");
while((c=getchar())!='\n')
{ for(i=65;i<=90;i++)
{
if(c==i||c==i+32)
{
a[i]=a[i]+1;
}
}
}
for(i=65;i<=90;i++)
{
if(a[i]!=0)
{ b[j]=a[i];
ch[j]=i;
len++;
j++;
printf("%c:%d\n",i,a[i]);
}
}
return len;
}
void huffmancoding(int n,huffmancode hc,hufftree ht,char ch[])
{
int i,start,child,father;
char *cd;
cd=(char*)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;i++)
{
start=n-1;
for(child=i,father=ht[i].parent;father!=0;child=father,father=ht[father].parent)
{
if(ht[father].lchild==child)
cd[--start]='0';
else
cd[--start]='1';
}
strcpy(hc[i],&cd[start]);
}
free(cd);
for(i=1;i<=n;i++)
{
printf("%c: %s\n",ch[i],hc[i]);
}
}

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define n 10
#define m (2*n-1)
char c[n] = { 'a','b','c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
int times[n] = { 10,9,5,8,2,4,1,4,6,2 };
typedef struct huffman_tree {
char ch;
int left, right, parent;
int weight;
}tree;
tree t[m],*tmp=t;
void init_parent(int par, int _m) {
int min = -1;
for (int i = 0; i < par; i++) {
if (t[i].parent != -1 || t[i].weight == 0) {
continue;
}
if (min == -1 || t[i].weight < t[min].weight) {
min = i;
}
}
t[min].parent = par;
if (_m == 0) {
t[par].right = min;
}
else {
t[par].left = min;
}
t[par].weight += t[min].weight;
}
void huffman_init() {
for (int i = 0; i < n; i++) {
t[i].ch = c[i];
}
tmp = (tree*)calloc(sizeof(tree), m);
for (int i = 0; i < m; i++) {
t[i].left = -1;
t[i].right = -1;
t[i].parent = -1;
t[i].weight = 0;
}
for (int i = 0; i < n; i++) {
t[i].weight = times[i];
}
tree *tmp = (tree*)malloc(sizeof(tree));
for (int i = n; i < m; i++) {
init_parent(i, 0);
init_parent(i, 1);
}
for (int i = 0; i < m; i++) {
printf("weigh:%d left:%d right:%d parent:%d char:%c\n", t[i].weight, t[i].left, t[i].right, t[i].parent, t[i].ch);
}
free(tmp);
}
char* huffman_code(char c) {
if (c == "\0") {
printf("结束符\n");
return;
}
char *r = (char *)calloc(sizeof(char),n);
int len = 0;
tree* tmp;
int ti;
for (int i = 0; i < n; i++) {
if (t[i].ch == c) {
tmp = &t[i];
ti = i;
while(tmp->parent != -1) {
len++;
if (ti == t[tmp->parent].left) {
r[n - len] = '0';
}
else {
r[n - len] = '1';
}
ti = tmp->parent;
tmp = &t[tmp->parent];
}
}
}
if (len == 0) {
printf("未能找到%c\n", c);
return;
}
char *q = calloc(sizeof(char),n+1);
int i;
for (i = 0; i < len; i++) {
q[i] = r[n - len + i];
}
q[i] = '\0';
printf("%c -> %s ", c, q);
return q;
}
char huffman_decode(char c[]) {
int i = 0 ;
int p = m-1 ;
while (p!=-1 && i<strlen(c)) {
if (c[i] == '0') {
p = t[p].left;
}
else if (c[i] == '1') {
p = t[p].right;
}
else if (c[i] == '\0') {
printf("结束符\n");
break;
}
else {
printf("异常字符\n");
return;
}
i++;
}
printf("%s -> %c\n", c, t[p].ch);
return t[p].ch;
}
//哈夫曼编码
void huffman() {
huffman_init();
for (int i = 0; i < n; i++) {
huffman_decode(huffman_code(c[i]));
}
}