/* * VarriableHuffuman.c * * Created on: 2010/04/16 * Author: super hoge */ #include #include typedef struct _HuffmanParty_ { int addr; unsigned char str_buf[64]; unsigned int num_buf[64]; unsigned int code[64]; } HuffmanObject; void seiki(HuffmanObject *hfo,unsigned char *buf){ unsigned char reg; int i; hfo->addr = 0; reg = *buf; hfo->str_buf[hfo->addr] = reg; hfo->num_buf[hfo->addr] = 1; while(*buf++){ reg = *buf; for(i=0;i<=hfo->addr;i++){ if(reg==hfo->str_buf[i]){ hfo->num_buf[i]++; break; } else ; } if(i>hfo->addr){ hfo->addr++; hfo->str_buf[hfo->addr] = reg; hfo->num_buf[hfo->addr] = 1; } else ; } int j,max = 0; for(i=0;iaddr;i++){ hfo->code[i]=1; for(j=0;jnum_buf[i]>hfo->num_buf[j]){ hfo->code[j]++; } else{ max = (max > hfo->code[j])? max : hfo->code[j]; hfo->code[i] = max + 1; } } } } int main(void){ unsigned char data[64]="AAABBCCDDDDDEEEFCCFGFBFFFGGGGGGHAA"; HuffmanObject *HO = (HuffmanObject *)malloc(sizeof(HuffmanObject)); int i; seiki(HO,data); for(i=0;iaddr;i++){ printf("%c : %d : %d\n",(char)HO->str_buf[i],HO->num_buf[i],HO->code[i]); } free(HO); return 0; }