哈夫曼编码时不完全显示只有第四个


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



img


#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]));
    }
    
    
}